从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);