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

の間に1つの行を必要とする1に

彼らは1から2までのラインにつながるとして、私は唯一の、最初の2つの要素のいずれかをしたい例えば

、および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

エクセレントは、私のために素晴らしい仕事しました。 –

関連する問題