2017-01-03 11 views
2

おはよう!JS/d3.js - d3.jsノードグラフの重複リンクの削除/マージ

私はJS/d3.jsで初心者と私は現在、小規模なプロジェクトに取り組んでいます..ここに私の以前の質問は次のとおりです。

マイプロジェクトユーザーの入力に基づいてソースとターゲットのペアを動的に作成することを目的としています。しかし、そうすることで、私は重複したリンクを持ついくつかのノードを持っています。さらに調べると、作成された配列のSource/Target要素が重複している可能性があることに気付きました。ここでは「リンク」のアレイ内に何が起こったかの抜粋です。

//Source and target are unique identifiers of each datastruct 
source: S001A, target: S002A 
source: S001A, target: S003A 
source: S001A, target: S004A  
source: S002A, target: S001A //Duplicate 
source: S002A, target: S005A 
source: S003A, target: S001A //Duplicate 
source: S003A, target: S006A 
source: S004A, target: S001A //Duplicate 
        ... 

これは、「フレンズ」のためのネストされた配列を持つ私の生のデータによるもので、ここではデータセット内のサンプルエントリです:

{ 
    "NRIC": "S001A", 
    "name": "Benjamin", 
    "blk": 123, 
    "estate": "Woodlands", 
    "street": "Woodlands Street 12", 
    "unitNo": "01-23", 
    "postal": 123123, 
    "school": "Nanyang Technological University", 
    "Friends": //Nested array.. 
    [ 
     "S002A", 
     "S003A", 
     "S004A", 
    ] 
} 
ここで

forループ私は、ネストされたデータのソース・ターゲットアレイを作成するために使用しています:

graphData.forEach(function(gdata,index) 
{ 
    for (i = 0; i < gdata.Friends.length; i++) 
    { 
     links.push({ 
      source: gdata.NRIC, 
      target: gdata.Friends[i] 
     });  
    } 
}); 

これは、forループの友人はEACの相互含まれていて当然のラインの下の重複が発生しますhその他。 (つまり、S001AはS002A、S003A、S004Aの友人であり、S002Aは彼の 'Friends'配列内にS001Aを持つ)。

..私は唯一のソース=== this.idソース/ターゲットのペアを使用するのではと思ったが、私はその後、いくつかのペアを省略することができ、それは、データの整合性に影響を与えることを恐れているものの配列からペアリングを繰り返して削除する方法はありますか?現在のfor-loopを修正するか、データの後処理を行うかのどちらかです。

ありがとうございました!

+1

私は似たような質問にしばらく前に答えて、ソリューションがあなたのケースで動作するかどうかを確認してください:http://stackoverflow.com/a/40167473/5768908 –

+1

ありがとうございました!ソート機能は私の場合は英数字の値を比較しているので私の場合は機能しませんでしたが、この方法でパフォーマンスの問題が発生することはわかっていますが、私はラウンドアバウト方式で処理しました。 –

答えて

2

@Gerardo Furtadoのおかげで助けになりました!の数を最適化するために、どのような方法があり、私はこれは非常に最適化されていないバージョンであることを知っている

graphData.forEach(function(gdata,index) 
{ 
    for (i = 0; i < gdata.Friends.length; i++) 
    { 
     links.push({ 
      source: gdata.NRIC, 
      target: gdata.Friends[i] 
     });  
    } 
}); 

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

//links.sort(); doesn't work as item to be sorted may be alphanmueric :(
var linkslength = links.length; 

links.forEach(function(d,i) 
{ 
    var curSrc = d.source, curTgt = d.target; 
    for(var j = i+1; j < linkslength; j++) 
    { 
     if (links[j].source === curSrc && links[j].target === curTgt) 
     { 
      links.splice(j,1); 
      linkslength -= 1; 
     } 
    } 
}); 

私は少しここで私が英数字の値のソートを必要とするソリューションを微調整しますが、私の作業の答えです回私はループする必要がありますか?また、links.lengthは各スプライス後に自動的に更新されないため、変数に格納し、各スプライス後に手動で減らしてしまうのではないかと心配しています。

Gerardo Furtadoさん、ありがとうございました!乾杯:)

+0

それは働いたことを知っていてうれしいです。 –

+0

もう一度あなたの助けをありがとう! :) –