¿Hay diccionarios en javascript como python?

Necesito hacer un diccionario en javascript como este

No recuerdo la notación exacta, pero era algo como:

states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ } 

hay tal cosa en javascript?

Related of "¿Hay diccionarios en javascript como python?"

Este es un post antiguo, pero pensé que debería proporcionar una respuesta ilustrada de todos modos.

Usa la notación de objetos de JavaScript. Al igual que:

 states_dictionary={ "CT":["alex","harry"], "AK":["liza","alex"], "TX":["fred", "harry"] }; 

Y para acceder a los valores:

 states_dictionary.AK[0] //which is liza 

o puede usar la notación de objeto literal de JavaScript, por lo que las claves no requieren estar entre comillas:

 states_dictionary={ CT:["alex","harry"], AK:["liza","alex"], TX:["fred", "harry"] }; 

No hay arrays asociativos reales en Javascript. Puedes intentar usar objetos:

 var x = new Object(); x["Key"] = "Value"; 

Sin embargo, con los objetos no es posible utilizar propiedades de matriz típicas o métodos como array.length. Al menos es posible acceder a la “matriz de objetos” en un bucle for-in.

He creado un diccionario simple en JS aquí:

 function JSdict() { this.Keys = []; this.Values = []; } // Check if dictionary extensions aren't implemented yet. // Returns value of a key if (!JSdict.prototype.getVal) { JSdict.prototype.getVal = function (key) { if (key == null) { return "Key cannot be null"; } for (var i = 0; i < this.Keys.length; i++) { if (this.Keys[i] == key) { return this.Values[i]; } } return "Key not found!"; } } // Check if dictionary extensions aren't implemented yet. // Updates value of a key if (!JSdict.prototype.update) { JSdict.prototype.update = function (key, val) { if (key == null || val == null) { return "Key or Value cannot be null"; } // Verify dict integrity before each operation if (keysLength != valsLength) { return "Dictionary inconsistent. Keys length don't match values!"; } var keysLength = this.Keys.length; var valsLength = this.Values.length; var flag = false; for (var i = 0; i < keysLength; i++) { if (this.Keys[i] == key) { this.Values[i] = val; flag = true; break; } } if (!flag) { return "Key does not exist"; } } } // Check if dictionary extensions aren't implemented yet. // Adds a unique key value pair if (!JSdict.prototype.add) { JSdict.prototype.add = function (key, val) { // Allow only strings or numbers as keys if (typeof (key) == "number" || typeof (key) == "string") { if (key == null || val == null) { return "Key or Value cannot be null"; } if (keysLength != valsLength) { return "Dictionary inconsistent. Keys length don't match values!"; } var keysLength = this.Keys.length; var valsLength = this.Values.length; for (var i = 0; i < keysLength; i++) { if (this.Keys[i] == key) { return "Duplicate keys not allowed!"; } } this.Keys.push(key); this.Values.push(val); } else { return "Only number or string can be key!"; } } } // Check if dictionary extensions aren't implemented yet. // Removes a key value pair if (!JSdict.prototype.remove) { JSdict.prototype.remove = function (key) { if (key == null) { return "Key cannot be null"; } if (keysLength != valsLength) { return "Dictionary inconsistent. Keys length don't match values!"; } var keysLength = this.Keys.length; var valsLength = this.Values.length; var flag = false; for (var i = 0; i < keysLength; i++) { if (this.Keys[i] == key) { this.Keys.shift(key); this.Values.shift(this.Values[i]); flag = true; break; } } if (!flag) { return "Key does not exist"; } } } 

La implementación anterior ahora se puede utilizar para simular un diccionario como:

 var dict = new JSdict(); dict.add(1, "one") dict.add(1, "one more") "Duplicate keys not allowed!" dict.getVal(1) "one" dict.update(1, "onne") dict.getVal(1) "onne" dict.remove(1) dict.getVal(1) "Key not found!" 

Esto es sólo una simulación básica. Puede optimizarse aún más mediante la implementación de un mejor algoritmo de tiempo de ejecución para trabajar en la complejidad del tiempo O (nlogn) al menos o incluso menos. Como combinar / ordenar rápidamente en matrices y luego algunas búsquedas B para búsquedas. No probé ni busqué el mapeo de una función hash en JS.

Además, la clave y el valor para el objeto JSdict se pueden convertir en variables privadas para que sean sigilosas.

¡Espero que esto ayude!

EDITAR >> Después de implementar lo anterior, personalmente utilicé los objetos JS como matrices asociativas que están disponibles fuera de la caja.

Sin embargo , me gustaría hacer una mención especial sobre dos métodos que en realidad resultaron útiles para que sea una experiencia conveniente para la tabla hash.

Viz: dict.hasOwnProperty (clave) y eliminar dict [clave]

Lea esta publicación como un buen recurso en esta implementación / uso. Creación dinámica de claves en una matriz asociativa de JavaScript.

¡Gracias!

Me doy cuenta de que esta es una pregunta antigua, pero aparece en Google cuando busca ‘diccionarios de javascript’, por lo que me gustaría agregar a las respuestas anteriores que en ECMAScript 6, se ha introducido el objeto Map oficial, que es un implementación del diccionario:

 var dict = new Map(); dict.set("foo", "bar"); //returns "bar" dict.get("foo"); 

A diferencia de los objetos normales de javascript, permite cualquier objeto como clave:

 var foo = {}; var bar = {}; var dict = new Map(); dict.set(foo, "Foo"); dict.set(bar, "Bar"); //returns "Bar" dict.get(bar); //returns "Foo" dict.get(foo); //returns undefined, as {} !== foo and {} !== bar dict.get({}); 

Usa objetos de JavaScript. Puede acceder a sus propiedades como claves en un diccionario. Esta es la base de JSON. La syntax es similar a los diccionarios de Python. Ver: JSON.org

Una pregunta antigua, pero hace poco tuve que hacer un puerto AS3> JS, y en aras de la velocidad, escribí un simple objeto de Diccionario de estilo AS3 para JS:

http://jsfiddle.net/MickMalone1983/VEpFf/2/

Si no lo sabía, el diccionario de AS3 le permite utilizar cualquier objeto como clave, en lugar de solo cadenas. Son muy útiles una vez que has encontrado un uso para ellos.

No es tan rápido como lo sería un objeto nativo, pero no he encontrado ningún problema significativo al respecto.

API:

 //Constructor var dict = new Dict(overwrite:Boolean); //If overwrite, allows over-writing of duplicate keys, //otherwise, will not add duplicate keys to dictionary. dict.put(key, value);//Add a pair dict.get(key);//Get value from key dict.remove(key);//Remove pair by key dict.clearAll(value);//Remove all pairs with this value dict.iterate(function(key, value){//Send all pairs as arguments to this function: console.log(key+' is key for '+value); }); dict.get(key);//Get value from key 

Firefox 13+ proporciona una implementación experimental del objeto de map similar al objeto dict en python. Especificaciones aquí .

Solo está disponible en Firefox, pero se ve mejor que usar los atributos de un new Object() . Citación de la documentación:

  • Un objeto tiene un prototipo, por lo que hay claves predeterminadas en el mapa. Sin embargo, esto se puede map = Object.create(null) usando map = Object.create(null) .
  • Las claves de un Object son Strings , donde pueden ser cualquier valor para un Map .
  • Puede obtener el tamaño de un Map fácilmente mientras tiene que realizar un seguimiento manual del tamaño de un Object .