【问题标题】:Removing duplicate edges from an array for a d3 force directed graph从 d3 力有向图的数组中删除重复边
【发布时间】:2017-03-03 04:38:14
【问题描述】:

我有一个力有向图的边数组,看起来像这样,但要长得多。

   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 语句是问题所在。或者这是完全错误的方法?

像往常一样,我敢肯定,这对眼光敏锐的人来说是显而易见的。 我的代码有什么问题?

【问题讨论】:

    标签: javascript node.js d3.js


    【解决方案1】:

    由于谁是源谁是目标都没有关系(“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);

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 2015-12-10
      • 2014-02-27
      • 2016-03-28
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多