2016-10-21 24 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

優秀,對我來說真是棒極了。 –