Digamos que eu tenha um array associativo Javascript (também conhecido como hash, também conhecido como dicionário):
var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;
Como posso iterar as chaves em ordem classificada? Se isso ajuda a simplificar as coisas, eu nem preciso dos valores (são todos apenas o número 1).
javascript
Mike
fonte
fonte
a = {};
.Respostas:
Você não pode iterar diretamente sobre eles, mas pode encontrar todas as chaves e então apenas classificá-las.
No entanto, não há necessidade de transformar a variável 'a' em um array. Você o está usando apenas como um objeto e deve criá-lo assim:
fonte
for
loop seobj.hasOwnProperty(key)
.Você pode usar o método interno Object.keys :
(Observação: isso não funciona em navegadores muito antigos que não oferecem suporte a EcmaScript5, principalmente IE6, 7 e 8. Para estatísticas atualizadas detalhadas, consulte esta tabela )
fonte
if (!Object.keys) { Object.keys = function (obj) { var op, result = []; for (op in obj) { if (obj.hasOwnProperty(op) { result.push(op) } } return result }
você pode até mesmo prototipá-lo no objeto:
e o uso:
fonte
key -> value
relacionamento.Concordo com a resposta de Swingley , e acho que é um ponto importante que muitas dessas soluções mais elaboradas estão faltando. Se você está preocupado apenas com as chaves na matriz associativa e todos os valores são '1', simplesmente armazene as 'chaves' como valores em uma matriz.
Ao invés de:
Usar:
A única desvantagem disso é que você não pode determinar se uma chave específica é definida com tanta facilidade. Veja esta resposta para a função javascript emArray para uma resposta a esse problema. Um problema com a solução apresentada é que
a.hasValue('key')
será um pouco mais lenta do quea['key']
. Isso pode ou não importar em seu código.fonte
Não há uma maneira concisa de manipular diretamente as "chaves" de um objeto Javascript. Não é realmente projetado para isso. Você tem a liberdade de colocar seus dados em algo melhor do que um objeto normal (ou um Array, como seu código de exemplo sugere)?
Em caso afirmativo, e se sua pergunta pudesse ser reformulada como "Que objeto semelhante a um dicionário devo usar se quiser iterar sobre as chaves em ordem classificada?" então você pode desenvolver um objeto como este:
Se você não tiver controle sobre o fato de que os dados estão em um objeto regular, este utilitário converterá o objeto regular em seu dicionário totalmente funcional:
Esta foi uma definição de objeto (em vez de uma função construtora reutilizável) para simplificar; edite à vontade.
fonte
Pegue as chaves no primeiro
for
loop, classifique-as e use o resultado classificado no segundofor
loop.fonte
Você pode usar a
keys
função da biblioteca underscore.js para obter as chaves e osort()
método de matriz para classificá-las:A
keys
função no código-fonte do sublinhado:fonte
fonte
fonte
Eu realmente gosto da ideia de protótipo de @luke-schafer, mas também ouço o que ele está dizendo sobre os problemas com protótipos. Que tal usar uma função simples?
Isso parece eliminar os problemas com protótipos e ainda fornecer um iterador classificado para objetos. No entanto, não sou realmente um guru do JavaScript, então adoraria saber se essa solução tem falhas ocultas que perdi.
fonte