force:节点数据应该按id索引,而不是数组index
eyworldwide opened this issue · 2 comments
eyworldwide commented
源码地址:https://github.com/TBEDP/datavjs/blob/master/lib/charts/force.js
Force.prototype.setSource = function (table, map) {
map = this.map(map);
//this.net = json;
if (table[0][0] === "node") {
table = table.slice(1);
}
var nData = [];
var lData = [];
var isNode = true;
var nodeNum;
var that = this;
table.forEach(function (d, i) {
var value;
if (isNode) {
if (d[map.nodeId] === "link") {
isNode = false;
nodeNum = i + 1;
} else {
if (d[map.nodeId] === "") {
throw new Error("ID can not be empty(line:" + (i + 1) + ").");
}
value = that._toNum(d[map.nodeValue]);
nData[i] = {
name: d[map.nodeName],
nodeValue: value
};
if (i === 0) {
that.nodeValueMin = value;
that.nodeValueMax = value;
}
that.nodeValueMin = (value < that.nodeValueMin) ? value : that.nodeValueMin;
that.nodeValueMax = (value > that.nodeValueMax) ? value : that.nodeValueMax;
}
} else {
if (d[map.linkSource - 3] === "") {
throw new Error("Source can not be empty(line:" + (i + 1) + ").");
}
if (d[map.linkTarget - 3] === "") {
throw new Error("Target can not be empty(line:" + (i + 1) + ").");
}
value = that._toNum(d[map.linkValue - 3]);
lData[i - nodeNum] = {
source: that._toNum(d[map.linkSource - 3]),
target: that._toNum(d[map.linkTarget - 3]),
value: that._toNum(d[map.linkValue - 3])
};
if (i === nodeNum) {
that.linkValueMin = value;
that.linkValueMax = value;
}
that.linkValueMin = (value < that.linkValueMin) ? value : that.linkValueMin;
that.linkValueMax = (value > that.linkValueMax) ? value : that.linkValueMax;
}
});
this.net.nodes = nData;
this.net.links = lData;
this.nodeValueMax++;
this.linkValueMax++;
};
这段代码中设置link的source和target的时候,应该根据数据的id来索引
lData[i - nodeNum] = {
source: that._toNum(d[map.linkSource - 3]),
target: that._toNum(d[map.linkTarget - 3]),
value: that._toNum(d[map.linkValue - 3])
};
fixed后的代码如下:
Force.prototype.setSource = function (table, map) {
map = this.map(map);
//this.net = json;
if (table[0][0] === "node") {
table = table.slice(1);
}
var nData = [],
lData = [],
isNode = true,
nodeNum,
that = this,
NUM = 3,
// FIXED: 用数据的id索引nodes
index = {},
source = map.linkSource - NUM,
target = map.linkTarget - NUM,
lValue = map.linkValue - NUM;
table.forEach(function (d, i) {
var value;
if (isNode) {
if (d[map.nodeId] === "link") {
isNode = false;
nodeNum = i + 1;
} else {
if (d[map.nodeId] === "") {
throw new Error("ID can not be empty(line:" + (i + 1) + ").");
}
value = +(d[map.nodeValue]);
nData[i] = {
name: d[map.nodeName],
nodeValue: value
};
if (i === 0) {
that.nodeValueMin = value;
that.nodeValueMax = value;
}
that.nodeValueMin = (value < that.nodeValueMin) ? value : that.nodeValueMin;
that.nodeValueMax = (value > that.nodeValueMax) ? value : that.nodeValueMax;
}
} else {
if (d[map.linkSource - 3] === "") {
throw new Error("Source can not be empty(line:" + (i + 1) + ").");
}
if (d[map.linkTarget - 3] === "") {
throw new Error("Target can not be empty(line:" + (i + 1) + ").");
}
value = +(d[map.linkValue - 3]);
// FIXED: 用数据的id索引nodes
index[d[map.id]] = i;
lData[i - nodeNum] = {
source: +(index[d[source]]),
target: +(index[d[target]]),
value: +(index[d[lValue]])
};
if (i === nodeNum) {
that.linkValueMin = value;
that.linkValueMax = value;
}
that.linkValueMin = (value < that.linkValueMin) ? value : that.linkValueMin;
that.linkValueMax = (value > that.linkValueMax) ? value : that.linkValueMax;
}
});
this.net.nodes = nData;
this.net.links = lData;
this.nodeValueMax++;
this.linkValueMax++;
};
fengmk2 commented
呃,直接close了?又吓跑一个?
2014-4-4 下午3:12于 "eyworldwide" notifications@github.com写道:
—
Reply to this email directly or view it on GitHubhttps://github.com//issues/146
.
theseue commented
没有,联系着,后续会提交的