我有一个力导向图的边数组,它看起来像这样,但更长。
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 to 2”与问题中的“2 to 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);
关于javascript - 从 d3 力定向图的数组中删除重复边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40166958/