objetos - map javascript
¿Cómo mantener un objeto/arreglo de Javascript ordenado mientras también se mantienen las búsquedas clave? (1)
Me he topado con este problema también. Una solución es mantener una matriz ordenada de claves además del objeto original.
var objects = {
"7": {"id":"7","name":"Hello"},
"3": {"id":"3","name":"World"},
...
}
var order = [ "3", "7", ... ];
Ahora, si quieres el segundo elemento, puedes hacer esta búsqueda:
var second_object = objects[order[1]];
El estándar ECMA no dice nada sobre el orden de los elementos en un objeto. Y específicamente, Chrome reordena las claves cuando se parecen a números. Ejemplo:
var example = {
"a": "a",
"b": "b",
"1": "1",
"2": "2"
};
si imprimes esto en Chrome obtendrás algo como:
{
1: "1",
2: "2",
"a": "a",
"b": "b"
};
Es un poco agrio ... pero la vida.
También podría usar la solución que Andy enlazó, básicamente envolviendo estos dos en un solo objeto.
Una alternativa que uso mucho es una función de mapa personalizada que le permite especificar el orden en que se atraviesa el objeto. Por lo general, hará la ordenación cuando imprima sus datos para el usuario, de modo que mientras hace un bucle y crea las filas de su tabla (por ejemplo) su iterador pasará las filas en el orden especificado por su función de clasificación. Pensé que era una buena idea :)
La firma se ve así:
function map(object, callback, sort_function);
Ejemplo de uso:
map(object, function (row) {
table.add_row(row.header, row.value);
}, function (key1, key2) {
return object[key1] - object[key2];
});
Tengo algunos datos que originalmente almacené en un objeto Javascript genérico, con el ID como clave:
{
"7": {"id":"7","name":"Hello"},
"3": {"id":"3","name":"World"},
...
}
Sin embargo, descubrí que los navegadores no garantizan un orden de objeto en particular al pasar por ellos, de modo que en el punto anterior "3" vendría antes que "7". Cambié a usar un formato de matriz como este:
[
{"id":"7","name":"Hello"},
{"id":"3","name":"World"},
...
]
Ahora puedo hacer un bucle en el orden correcto pero no puedo realizar búsquedas rápidas, por ejemplo, data["3"]
sin tener que recorrer el conjunto.
¿Hay una buena manera de combinar ambos enfoques? Prefiero evitar el uso de un objeto separado para cada formato, porque el objeto es bastante grande (cientos de elementos).