2012-07-15 13 views
9

Quando riordino una selezione di percorsi in d3 con select.sort(), l'unione dati viene disturbata e i miei percorsi vengono riassegnati agli oggetti dati errati.L'ordinamento di una selezione in d3.js disturba l'unione dati

Voglio solo riordinare i percorsi in modo che alcuni finiscano sopra gli altri (come in z-index). Non voglio riassegnare gli oggetti dati da un percorso all'altro.

Come posso riordinare i percorsi senza disturbare l'unione dati?

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

risposta

11

Sembra che sia necessario specificare un key function. Ciò consente di associare i dati con una chiave arbitraria, anziché fare affidamento sull'impostazione predefinita, ovvero utilizzare la posizione del riferimento nell'array, ovvero l'ordine (che nel tuo caso potrebbe cambiare).

Se non si dispone già di una chiave univoca per ogni dato, si può sempre e solo loro generare al momento del caricamento:

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

Se si crea qualsiasi nuovo dati che si può continuare a incrementare id per ottenere un nuovo ID univoco.

Poi, per l'associazione dati si può fare:

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

Grazie, Jason, una funzione chiave ha fatto il trucco. – Mark

+3

Vedere anche il [tutorial sulla costanza degli oggetti] (http://bost.ocks.org/mike/constancy/), che tratta delle funzioni chiave. – mbostock