Se trata de una cuestión de edad, sino porque las respuestas existentes podrían ser muy peligroso, quería dejar esta respuesta para aquellas personas futuras que podrían tropezar aquí ...
El las respuestas basadas en el uso de un Objeto como HashMap están rotas y pueden causar consecuencias extremadamente desagradables si usa cualquier otra cosa que no sea una Cadena como clave. El problema es que las propiedades del objeto se fuerzan a cadenas usando el método .toString. Esto puede conducir a la siguiente maldad:
function MyObject(name) {
this.name = name;
};
var key1 = new MyObject("one");
var key2 = new MyObject("two");
var map = {};
map[key1] = 1;
map[key2] = 2;
Si estabas esperando que el objeto se comportarían de la misma manera que un mapa de Java aquí, sería bastante molesto para descubrir que el mapa sólo contiene uno entrada con el cadena de clave [object Object]
:
> JSON.stringify(map);
{"[object Object]": 2}
Esto es claramente no un reemplazo para HashMap de Java. Curiosamente, dada su edad, Javascript actualmente no tiene un objeto de mapa de propósito general. Sin embargo, hay esperanza en el horizonte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map aunque un vistazo a la tabla de compatibilidad del navegador mostrará que esto aún no está listo para usarse en aplicaciones web de propósito general.
Mientras tanto, lo mejor que puede hacer es:
- utilizan deliberadamente cadenas como claves. Es decir. utilice cadenas explícitas como claves en lugar de confiar en el .toString -ing implícito de las claves que usa.
- Asegúrese de que los objetos que está utilizando como claves tengan un método .toString() bien definido que se ajuste a su comprensión de la singularidad de estos objetos.
- Si no puede/no desea cambiar .toString de los objetos clave, al almacenar y recuperar las entradas, convierta los objetos en una cadena que represente su comprensión de la singularidad. P.ej.
map[toUniqueString(key1)] = 1
A veces, sin embargo, eso no es posible. Si desea asignar datos en función de, por ejemplo, objetos de archivo, no existe una manera confiable de hacerlo porque los atributos que expone el objeto Archivo no son suficientes para garantizar su exclusividad. (Puede tener dos objetos File que representen archivos diferentes en el disco, pero no hay forma de distinguirlos en JS en el navegador).En estos casos, desafortunadamente, todo lo que puede hacer es refactorizar su código para eliminar la necesidad de almacenarlos en un futuro; quizás, usando una matriz en su lugar y haciendo referencia a ellos exclusivamente por índice.
Actualicé mi respuesta para usar un 'nuevo Object()' en lugar de 'new Array()'. Ver [este artículo] (http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/) –
¿Cómo podemos proporcionar un nodo raíz aquí? – Krishnan
¿Cómo podemos eliminar un pagador de valores clave del mapa? –