Javascript 从d3力有向图的数组中删除重复边
我有一个力定向图的边数组,看起来像这样,但长得多Javascript 从d3力有向图的数组中删除重复边,javascript,node.js,d3.js,Javascript,Node.js,D3.js,我有一个力定向图的边数组,看起来像这样,但长得多 var rawLinks = [{ source: 1, target: 2 }, { source: 2, target: 1 }, { source: 6, target: 7 }, { source: 7, target: 6 }, { source: 8, target: 9 },
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])
}
}
}
var-links=[];
对于(var i=0;i,因为谁是源谁是目标并不重要(“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;
}
函数removeDups(myArray){
myArray.sort();
对于(变量i=1;i
下面是一个演示:
var rawLinks=[{source:1,target:2},
{来源:2,目标:1},
{来源:6,目标:7},
{来源:7,目标:6},
{来源:8,目标:9},
{来源:8,目标:9},
{来源:8,目标:86},
{来源:8,目标:101},
{来源:8,目标:133},
{来源:8,目标:134}];
rawLinks.forEach(函数(d){
var sourceTemp=d.source;targetTemp=d.target;
如果(d源>d目标){
d、 来源=targetTemp;
d、 目标=源温度;
}
});
函数removeDups(myArray){
myArray.sort();
对于(变量i=1;i