javascript - 从 d3 力定向图的数组中删除重复边

标签 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 },
                  { 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/

相关文章:

javascript - 这是做 JS OOP 的好方法吗?

node.js - nodeS CORS 的问题

javascript - D3无法获取this.parentNode

带有对象表示法的javascript函数参数

javascript - 修改 Javascript 中的字典键

javascript - 如何在 Express.js 中提取 GET 表单数据

javascript - 在其他回调返回后调用回调函数的优雅方式

node.js - Nodejs按顺序运行任务

javascript - 从 map 中移除 carto 层

javascript - d3 选择 .attr ('x1' ) 返回 r.getAttribute 不是函数