2012-07-15 76 views
9

當我使用selection.sort()對d3中的所有路徑重新排序時,數據連接受到干擾,我的路徑被重新分配給錯誤的數據對象。對d3.js中的選擇進行排序干擾了數據連接

我只想對路徑進行重新排序,以便有些路徑最終位於其他路徑之上(如在z-index中)。我不想將數據對象從一個路徑重新分配給另一個路徑。

如何在不干擾數據連接的情況下對路徑重新排序?

_friends.selectAll('path').sort(function(a, b){ 
    return d3.ascending(a.Q, b.Q); 
}); 

回答

11

聽起來你需要指定一個key function。這使您可以通過任意鍵綁定數據,而不是依賴默認值,即使用數據中的數據位置,即順序(在您的情況下可能會更改)。

如果您還沒有對每個數據的唯一密鑰,你永遠可以在加載時生成它們:

var id = 0; 
for (var i = 0; i < data.length; i++) data[i].id = id++; 

如果您創建任何新的數據,您可以繼續遞增id獲得新的,唯一的ID。

然後,數據綁定,你可以這樣做:

.data(data, function(d) { return d.id; }) 
+0

謝謝你,傑森,一鍵功能的伎倆。 – Mark 2012-07-17 06:53:44

+3

另請參閱[關於對象常量的教程](http://bost.ocks.org/mike/constancy/),其中討論了關鍵函數。 – mbostock 2012-07-17 23:33:08

相關問題