Preciso armazenar algumas estatísticas usando JavaScript de uma maneira como faria em C #:
Dictionary<string, int> statistics;
statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);
Existe um Hashtable
ou algo como Dictionary<TKey, TValue>
em JavaScript?
Como eu poderia armazenar valores dessa maneira?
javascript
dictionary
hashtable
George2
fonte
fonte
Respostas:
Use objetos JavaScript como matrizes associativas .
Crie um objeto com
Uma sintaxe alternativa para o mesmo é:
Se você também pode criar chave para valorizar mapas de objetos com a seguinte sintaxe
fonte
new Array()
é desaprovada. O artigo finalmente menciona suas desvantagens e sugerenew Object()
ou{}
como alternativas preferidas, mas isso está próximo do fim e eu temo que a maioria dos leitores não chegue tão longe.var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays B
porque não é possível diferenciar entre as chaves obj1 e obj2; ambos são convertidos em string e se tornam algo como "Object". Falha total e torna a serialização com segurança de tipo com referências e referências cíclicas intactas difíceis ou sem desempenho em JavaScript. É fácil no Flash / AS3.Point.prototype.equals = function(obj) { return (obj instanceof Point) && (obj.x === this.x) && (obj.y === this.y); };
for... in
pois um dicionário passa por cima de suas teclas, entãoObject.keys
parece mal colocado ali.Object.keys
retorna uma matriz das chaves do dicionário e,for... in
para uma matriz, passa por cima de suas "chaves", que para uma matriz são seus índices, não seus valores.Se você é oriundo de uma linguagem orientada a objetos, verifique este artigo .
fonte
Todos os navegadores modernos suportam um objeto de mapa javascript . Existem algumas razões que tornam o uso de um mapa melhor que o Object:
Exemplo:
Se você deseja que as chaves que não são referenciadas de outros objetos sejam coletadas como lixo, considere usar um WeakMap em vez de um Mapa.
fonte
Map
é pouco útil quando sua chave é um objeto, mas deve ser comparada por valor, não por referência.A menos que você tenha um motivo específico para não, basta usar um objeto normal. As propriedades do objeto em Javascript podem ser referenciadas usando a sintaxe no estilo de hashtable:
Ambos
foo
ebar
elementos podem agora ser referenciado como:Claro que isso significa que suas chaves precisam ser seqüências de caracteres. Se não forem cadeias de caracteres, elas serão convertidas internamente em cadeias de caracteres, portanto ainda poderá funcionar, YMMV.
fonte
var hash = {}; hash[1] = "foo"; alert(hash["1"]);
alerta "foo".var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";
o elemento key1 do dict pode ser referenciado equivalentemente por ambosdict["key1"]
edict.key1
.Como todo objeto em JS se comporta como - e geralmente é implementado como - uma hashtable, eu apenas uso isso ...
fonte
if (hashSweetHashTable.foo)
deve inserir o bloco if sefoo
estiver definido.então, em C #, o código se parece com:
ou
em JavaScript
O objeto de dicionário C # contém métodos úteis, como
dictionary.ContainsKey()
no JavaScript, podemos usar ohasOwnProperty
mesmofonte
hasOwnProperty
Se você precisar que suas chaves sejam qualquer objeto, e não apenas cadeias de caracteres, use minha jshashtable .
fonte
fonte
{}
não um array:[]
ounew Array()
se você pretende ter chaves de string, caso contrário, o mecanismo js tem um problema - ele verá 2 tipos para 1 variável, o que significa que não há otimização ou será executado com o array e perceberá precisa mudar para objeto (possível realocação).Eu criei isso para obter algum problema, como mapeamento de chave de objeto, capacidade de enumeração (com
forEach()
método) e limpeza.Documentação da aula
Hashtable
Métodos:
get(key)
Retorna o valor associado à chave especificada.
Parâmetros::
key
A chave da qual recuperar o valor.put(key, value)
Associa o valor especificado à chave especificada.
Parâmetros::
key
A chave à qual associar o valor.value
: O valor a ser associado à chave.remove(key)
Remove a chave especificada com seu valor.
Parâmetros::
key
A chave a ser removida.clear()
Limpa toda a hashtable, removendo as chaves e os valores.
indexOfKey(key)
Retorna o índice da chave especificada, com base na ordem de adição.
Parâmetros::
key
cuja chave obtém o índice.indexOfValue(value)
Retorna o índice do valor especificado, com base na ordem de adição.
Parâmetros::
value
cujo valor obtém o índice.Notas:
Essas informações são recuperadas pelo
indexOf()
método de uma matriz, portanto, comparam o objeto apenas com otoString()
métodoentryAt(index)
Retorna um objeto com duas propriedades: chave e valor, representando a entrada no índice especificado.
Parâmetros::
index
O índice da entrada a ser obtida.containsKey(key)
Retorna se a hashtable contém a chave especificada.
Parâmetros::
key
A chave a ser verificada.containsValue(value)
Retorna se a hashtable contém o valor especificado.
Parâmetros::
value
O valor a ser verificado.forEach(iterator)
Repete todas as entradas no especificado
iterator
.Parâmetros:
value
: Um método com parâmetros: 3key
,value
eindex
, ondeindex
representa o índice da entrada.Propriedades:
length
( Somente leitura )Obtém a contagem das entradas na hashtable.
keys
( Somente leitura )Obtém uma matriz de todas as chaves na hashtable.
values
( Somente leitura )Obtém uma matriz de todos os valores na hashtable.
entries
( Somente leitura )Obtém uma matriz de todas as entradas na hashtable. Eles são representados na mesma forma do método
entryAt()
.fonte
https://gist.github.com/alexhawkins/f6329420f40e5cafa0a4
fonte
Você pode criar um usando o seguinte:
fonte