从d3力指向图中删除arrays的重复边

我有一个力量指向图的边缘arrays,看起来像这样,但更长。

var rawLinks = [{ source: 1, target: 2 }, { source: 2, target: 1 }, { source: 6, target: 7 }, { source: 7, target: 6 }, { source: 8, target: 9 }, { source: 8, target: 9 }, { source: 8, target: 86 }, { source: 8, target: 101 }, { source: 8, target: 133 }, { source: 8, target: 134 }] 

由于这些是表面上的点,因此我想删除将导致点之间重复的线条的元素。

例如,我只想要前两个元素中的一个,因为它们会导致从1到2,2到1的行。我只需要1到2之间的一行。

我试过这个,但是我得到了意想不到的结果。

 var links = []; for (var i=0; i<rawLinks.length; i++) { for (var j=0; j<rawLinks.length; j++) { if(rawLinks[i].source != rawLinks[j].target && rawLinks[i].target != rawLinks[j].source){ links.push(rawLinks[i]) } } } 

我很确定我的if语句是问题。 或者这是完全错误的方法?

像往常一样,我相信它明显是一个新鲜的眼睛。 我的代码有什么问题?

因为谁是源代码和谁是目标(在你的问题中“1到2”和“2到1”是一样的),我们将首先重新组织数组:

 rawLinks.forEach(function(d){ var sourceTemp = d.source, targetTemp = d.target; if(d.source > d.target){ d.source = targetTemp; d.target = sourceTemp; } }); 

这会造成重复,如下所示:

 { source: 1, target: 2 } { source: 1, target: 2 } 

然后,我们删除重复项:

 function removeDups(myArray){ myArray.sort(); for(var i = 1; i < myArray.length; ){ if(myArray[i-1].source === myArray[i].source && myArray[i-1].target === myArray[i].target){ myArray.splice(i, 1); } else { i++; } } return myArray; } 

这里是一个演示:

 var rawLinks = [{ source: 1, target: 2 }, { source: 2, target: 1 }, { source: 6, target: 7 }, { source: 7, target: 6 }, { source: 8, target: 9 }, { source: 8, target: 9 }, { source: 8, target: 86 }, { source: 8, target: 101 }, { source: 8, target: 133 }, { source: 8, target: 134 }]; rawLinks.forEach(function(d){ var sourceTemp = d.source; targetTemp = d.target; if(d.source > d.target){ d.source = targetTemp; d.target = sourceTemp; } }); function removeDups(myArray){ myArray.sort(); for(var i = 1; i < myArray.length; ){ if(myArray[i-1].source === myArray[i].source && myArray[i-1].target === myArray[i].target){ myArray.splice(i, 1); } else { i++; } } return myArray; } removeDups(rawLinks); console.log(rawLinks);