2017-01-03 272 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] 
     });  
    } 
}); 

這種用於循環將理解導致重複的路線作爲朋友是相互包容EAC的h其他。 (即S001A是S002A,S003A和S004A的朋友,S002A在他的'朋友'陣列中也有S001A)。

雖然我還以爲只使用源/目標對其中source === 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和SO的幫助!乾杯:)

+0

很高興知道它的工作原理。 –

+0

再次感謝您的幫助! :) –