从数组中删除d3强制有向图的重复边 [英] Removing duplicate edges from an array for a d3 force directed graph

查看:107
本文介绍了从数组中删除d3强制有向图的重复边的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个强制有向图的边缘数组,看起来像这样,但是更长。

  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}]
pre>

由于这些是表面上用于跟随线的点,因此我要删除会导致点之间重复线的元素。



例如,我只需要前两个元素中的一个,因为它们会产生一个从1到2和2到1的行。我只需要一行

 

code> var links = [];

for(var i = 0; 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])
}
}
}



'm很肯定我的if语句是问题。还是这是完全错误的方法?



像往常一样,我相信它对那些有新鲜眼神的人来说是显而易见的。
我的代码有什么问题?

解决方案

因为无论谁是源,谁是目标(1到2 2到1),我们将首先重组数组:

  rawLinks.forEach {
var sourceTemp = d.source,targetTemp = d.target;
if(d.source> d.target){
d.source = targetTemp;
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 :源:8,目标:9},{源:8,目标:9},{源:8,目标:9} :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  


I have an array of edges for a force directed graph, which looks like this but much longer.

   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 }]

As these are points on a surface for a line to follow, I want to remove elements that will result in duplicate lines between points.

For example I only want one of the first two elements, as they would result in a line from 1 to 2, and 2 to 1. I only need one line between 1 and 2.

I've tried this, but I get unexpected results.

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])
        }
      }
  }   

I'm pretty sure my if statement is the issue. Or is this the completely wrong approach?

As usual I'm sure its obvious to someone with fresh eyes. What's wrong with my code?

解决方案

Since it doesn't matter who is the source and who is the target ("1 to 2" is the same of "2 to 1" in your problem), we'll first reorganize the array:

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

That creates duplicates, like this:

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

Then, we remove the duplicates:

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;
}

Here is a demo:

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

这篇关于从数组中删除d3强制有向图的重复边的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆