2016-10-21 22 views
1

我有一个强制有向图的边的阵列,看起来像这样,但更长。为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 }] 

由于这些是表面上的点要跟随,我想要删除将导致点之间重复行的元素。

例如我只想要前两个元素中的一个,因为它们将导致从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

由于不要紧谁是源谁是目标(“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 }]; 
 
\t \t \t \t \t \t \t \t \t 
 
rawLinks.forEach(function(d){ 
 
\t var sourceTemp = d.source; targetTemp = d.target; 
 
\t if(d.source > d.target){ 
 
\t \t d.source = targetTemp; 
 
\t \t d.target = sourceTemp; 
 
\t } 
 
}); 
 

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

+0

优秀,对我来说真是棒极了。 –