JS/d3.JS-删除/合并d3.JS节点图中的重复链接



您好!

我是js/d3.js的初学者,目前正在做一个小项目。。以下是我之前的问题:

  • D3.js:基于相同的json值动态生成源和目标
  • JS/d3.JS:突出显示相邻链接的步骤

我的项目旨在根据用户输入动态创建源和目标对。然而,在这样做的过程中,我有几个具有重复链接的节点。经过进一步检查,我意识到这可能是由于创建的数组中存在重复的源/目标元素。以下是"链接"数组内部发生的事情的摘录:

//Source and target are unique identifiers of each datastruct
source: S001A, target: S002A
source: S001A, target: S003A
source: S001A, target: S004A       
source: S002A, target: S001A //Duplicate
source: S002A, target: S005A
source: S003A, target: S001A //Duplicate
source: S003A, target: S006A
source: S004A, target: S001A //Duplicate
...

这是因为我的原始数据有一个嵌套的"Friends"数组,这里是数据集中的一个示例条目:

{
"NRIC": "S001A",
"name": "Benjamin",
"blk": 123,
"estate": "Woodlands",
"street": "Woodlands Street 12",
"unitNo": "01-23",
"postal": 123123,
"school": "Nanyang Technological University",
"Friends": //Nested array..
[
"S002A",
"S003A",
"S004A",
]
}

以下是我用来为嵌套数据创建源目标数组的for循环:

graphData.forEach(function(gdata,index)
{
for (i = 0; i < gdata.Friends.length; i++)
{
links.push({
source: gdata.NRIC,
target: gdata.Friends[i]
});     
}
});

可以理解,这种for循环会导致重复,因为朋友之间相互包容。(即S001A与S002A、S003A和S004A是好友。S002A的"好友"数组中也将包含S001A)。

虽然我想只使用source===this.id的源/目标对,但我担心我可能会省略一些对,这会影响数据的完整性。。

有没有一种方法可以让我遍历数组并从数组中删除配对?要么通过修改当前for循环,要么对数据进行后处理。。

非常感谢你的帮助!

感谢@Gerardo Furtado的帮助!

我稍微调整了一下解决方案,因为我需要对字母数字值进行排序,但以下是我的工作答案:

graphData.forEach(function(gdata,index)
{
for (i = 0; i < gdata.Friends.length; i++)
{
links.push({
source: gdata.NRIC,
target: gdata.Friends[i]
});     
}
});
links.forEach(function(d) {
var sourceTemp = d.source, targetTemp = d.target;
if (d.source > d.target)
{
d.source = targetTemp;
d.target = sourceTemp;
}
});
//links.sort(); doesn't work as item to be sorted may be alphanmueric :(
var linkslength = links.length;
links.forEach(function(d,i)
{
var curSrc = d.source, curTgt = d.target;
for(var j = i+1; j < linkslength; j++)
{
if (links[j].source === curSrc && links[j].target === curTgt)
{
links.splice(j,1);
linkslength -= 1;
}
}
}); 

我知道这是一个非常未优化的版本,有什么方法可以优化我必须循环的次数吗?此外,我担心links.length在每次拼接后不会自动更新,因此我将其存储在一个变量中,并在每次拼接之后手动减少。

感谢Gerardo Furtado和SO的帮助!干杯:)

最新更新