2012-07-15 6 views
9

Cuando reordenaré una selección de rutas en d3 con selection.sort(), la combinación de datos se altera y mis rutas se reasignan a los objetos de datos incorrectos.Ordenar una selección en d3.js altera la combinación de datos

Solo quiero reordenar las rutas para que algunas terminen encima de otras (como en z-index). No quiero reasignar objetos de datos de una ruta a otra.

¿Cómo puedo reordenar las rutas sin molestar la unión de datos?

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

Respuesta

11

Parece que necesita especificar un key function. Esto le permite vincular datos mediante una clave arbitraria, en lugar de confiar en el valor predeterminado, que es usar la posición del punto de referencia en la matriz, es decir, el orden (que en su caso puede cambiar).

Si aún no dispone de una clave única para cada dato, siempre puede generarlos en tiempo de carga:

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

Si crea ningún dato nuevo que pueda seguir para incrementar id para obtener una ID nuevo y único.

Entonces, para el enlace de datos que puede hacer:

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

Gracias, Jason, una función clave resolvieron el problema. – Mark

+3

Consulte también el [tutorial sobre la constancia de objetos] (http://bost.ocks.org/mike/constancy/), que analiza las funciones clave. – mbostock