Necesito almacenar algunas estadísticas usando JavaScript de una manera como lo haría en C #:
Dictionary<string, int> statistics;
statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);
¿Hay Hashtable
algo o algo así Dictionary<TKey, TValue>
en JavaScript?
¿Cómo podría almacenar valores de tal manera?
javascript
dictionary
hashtable
George2
fuente
fuente
Respuestas:
Use objetos JavaScript como matrices asociativas .
Crea un objeto con
Una sintaxis alternativa para el mismo es:
Si también puede crear claves para asignar mapas de objetos con la siguiente sintaxis
fuente
new Array()
está mal visto. El artículo finalmente menciona sus inconvenientes y sugierenew Object()
o{}
como alternativas preferidas, pero eso está cerca del final y me temo que la mayoría de los lectores no llegarán tan lejos.var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays B
porque no puede diferenciar entre las claves obj1 y obj2; ambos se convierten en cadenas y se convierten en algo así como "Objeto". Fallo total, y hace que la serialización de tipo seguro con referencias y referencias cíclicas intactas sea difícil o no tenga rendimiento en JavaScript. Es fácil en Flash / AS3.Point.prototype.equals = function(obj) { return (obj instanceof Point) && (obj.x === this.x) && (obj.y === this.y); };
for... in
porque un diccionario recorrerá sus teclas, por lo queObject.keys
parece mal ubicado allí.Object.keys
devuelve una matriz de las claves del diccionario y,for... in
para una matriz, recorre sus "claves", que para una matriz son sus índices, no sus valores.Si viene de un lenguaje orientado a objetos, debería consultar este artículo .
fuente
Todos los navegadores modernos admiten un objeto Map de JavaScript . Hay un par de razones que hacen que usar un Mapa sea mejor que un Objeto:
Ejemplo:
Si desea que las claves a las que no se hace referencia desde otros objetos se recojan como basura, considere usar un WeakMap en lugar de un Mapa.
fuente
Map
es apenas útil cuando su clave es un objeto, pero debe compararse por valor, no por referencia.A menos que tenga una razón específica para no hacerlo, simplemente use un objeto normal. Se puede hacer referencia a las propiedades de objeto en Javascript utilizando la sintaxis de estilo hashtable:
Ambos elementos
foo
ybar
ahora pueden ser referenciados como:Por supuesto, esto significa que sus claves deben ser cadenas. Si no son cadenas, se convierten internamente en cadenas, por lo que aún puede funcionar, YMMV.
fuente
var hash = {}; hash[1] = "foo"; alert(hash["1"]);
alerta "foo".var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";
el elemento key1 de dict puede ser referenciado de manera equivalente por ambosdict["key1"]
ydict.key1
.Dado que cada objeto en JS se comporta como, y generalmente se implementa como, una tabla hash, simplemente sigo con eso ...
fuente
if (hashSweetHashTable.foo)
debería ingresar el bloque if sifoo
está configurado.entonces en C # el código se ve así:
o
en JavaScript
El objeto del diccionario C # contiene métodos útiles, como
dictionary.ContainsKey()
en JavaScript, podríamos usar elhasOwnProperty
likefuente
hasOwnProperty
Si necesita que sus claves sean cualquier objeto en lugar de solo cadenas, puede usar mi jshashtable .
fuente
fuente
{}
no una matriz:[]
onew Array()
si tiene la intención de tener claves de cadena, de lo contrario, el motor js tiene un problema: verá 2 tipos para 1 variable, lo que significa que no hay optimización o se ejecutará con la matriz y se dará cuenta tiene que cambiar a objeto (posible reasignación).Creé esto para lograr algún problema, como el mapeo de clave de objeto, la capacidad de enumeración (con el
forEach()
método) y el borrado.Documentación de clase.
Hashtable
Métodos:
get(key)
Devuelve el valor asociado a la clave especificada.
Parámetros::
key
la clave de la que recuperar el valor.put(key, value)
Asocia el valor especificado a la clave especificada.
Parámetros::
key
la clave a la que asocia el valor.value
: El valor a asociar a la clave.remove(key)
Elimina la clave especificada con su valor.
Parámetros::
key
la clave para eliminar.clear()
Borra toda la tabla hash, eliminando tanto las claves como los valores.
indexOfKey(key)
Devuelve el índice de la clave especificada, en función del orden de adición.
Parámetros::
key
La clave de la cual obtiene el índice.indexOfValue(value)
Devuelve el índice del valor especificado, en función del orden de adición.
Parámetros::
value
el valor del cual se obtiene el índice.Notas:
Esta información se recupera por el
indexOf()
método de una matriz, por lo que compara el objeto solo con eltoString()
método.entryAt(index)
Devuelve un objeto con dos propiedades: clave y valor, que representa la entrada en el índice especificado.
Parámetros::
index
el índice de la entrada a obtener.containsKey(key)
Devuelve si la tabla hash contiene la clave especificada.
Parámetros::
key
La clave para verificar.containsValue(value)
Devuelve si la tabla hash contiene el valor especificado.
Parámetros::
value
el valor a verificar.forEach(iterator)
Itera todas las entradas en el especificado
iterator
.Parámetros:
value
: Un método con 3 parámetros:key
,value
yindex
, dondeindex
representa el índice de la entrada.Propiedades:
length
( Solo lectura )Obtiene el recuento de las entradas en la tabla hash.
keys
( Solo lectura )Obtiene una matriz de todas las claves en la tabla hash.
values
( Solo lectura )Obtiene una matriz de todos los valores en la tabla hash.
entries
( Solo lectura )Obtiene una matriz de todas las entradas en la tabla hash. Están representados en la misma forma del método
entryAt()
.fuente
https://gist.github.com/alexhawkins/f6329420f40e5cafa0a4
fuente
Puede crear uno usando lo siguiente:
fuente