Preciso classificar objetos JavaScript por chave.
Daí o seguinte:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Se tornaria:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
javascript
sorting
vdh_ant
fonte
fonte
Object.entries
eObject.fromEntries
foram adicionados ao JS, isso pode ser alcançado com uma única linha bem curta:Object.fromEntries(Object.entries(obj).sort())
Respostas:
As outras respostas a esta pergunta estão desatualizadas, nunca correspondem à realidade da implementação e ficaram oficialmente incorretas agora que as especificações do ES6 / ES2015 foram publicadas.
Consulte a seção sobre ordem de iteração de propriedade em Explorando o ES6 por Axel Rauschmayer :
Portanto, sim, os objetos JavaScript são de fato ordenados e a ordem de suas chaves / propriedades pode ser alterada.
Veja como você pode classificar um objeto por suas chaves / propriedades em ordem alfabética:
Use em
var
vez deconst
para compatibilidade com os mecanismos ES5.fonte
Os objetos JavaScript 1 não estão ordenados. Não faz sentido tentar "classificá-las". Se você deseja iterar sobre as propriedades de um objeto, pode classificar as chaves e recuperar os valores associados:
Implementação alternativa usando
Object.keys
fantasia:1 Não é pedante, mas não existe um objeto JSON .
fonte
{"a", 1}
como JSON Array é um termo preciso para uma string como[1]
. É útil poder se comunicar dizendo coisas como o terceiro objeto na minha matriz quando você tem a string[{x: 1}, {y: 2}, {z: 3}]
, então eu prefiro "Isso não é um objeto JSON" ao comentar sobre um literal Javascript, em vez de "Não existe tal como um objeto JSON ", que só causará mais confusão e dificuldades de comunicação mais tarde, quando o OP realmente estiver trabalhando com JSON.{"a", 1}
é um literal de objeto ou um texto JSON (também conhecido como string JSON, se você realmente preferir). Depende do contexto; o primeiro, se aparecer literalmente no código-fonte JavaScript; o segundo, se for uma sequência que precisa ser passada para um analisador JSON para ser usada posteriormente. Existem diferenças reais entre os dois quando se trata de sintaxe permitida, uso correto e serialização.Muitas pessoas mencionaram que "os objetos não podem ser classificados" , mas depois disso eles estão fornecendo uma solução que funciona. Paradoxo, não é?
Ninguém menciona por que essas soluções estão funcionando. Eles são, porque na maioria das implementações do navegador, os valores nos objetos são armazenados na ordem em que foram adicionados. É por isso que se você criar um novo objeto a partir da lista ordenada de chaves, ele retornará um resultado esperado.
E acho que poderíamos adicionar mais uma solução - a maneira funcional do ES5:
Versão ES2015 acima (formatada para "uma linha"):
Breve explicação dos exemplos acima (conforme solicitado nos comentários):
Object.keys
está nos dando uma lista de chaves no objeto fornecido (obj
ouo
), depois classificamos as que usam o algoritmo de classificação padrão. Em seguida,.reduce
é usado para converter essa matriz novamente em um objeto, mas desta vez com todas as chaves classificadas.fonte
for...in
).Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
Gente, estou figurativamente chocado! Claro que todas as respostas são um pouco antigas, mas ninguém sequer mencionou a estabilidade na classificação! Então, fique comigo, vou tentar o meu melhor para responder à pergunta em si e entrar em detalhes aqui. Então, vou pedir desculpas agora, será muito para ler.
Como em 2018, usarei apenas o ES6, os Polyfills estão disponíveis nos documentos MDN, os quais vincularemos na parte especificada.
Responda a pergunta:
Se suas chaves são apenas números, então você pode usar com segurança
Object.keys()
juntamente comArray.prototype.reduce()
a devolver o objeto ordenada:No entanto, se você estiver trabalhando com strings, recomendo encadear
Array.prototype.sort()
tudo isso:Se alguém está se perguntando o que reduz:
Se necessário, aqui está a explicação para o liner:
Por que a classificação é um pouco complicada:
Em resumo
Object.keys()
, retornará uma matriz com a mesma ordem que obtemos com um loop normal:Sidenote - você também pode usar
Object.keys()
matrizes, lembre-se de que o índice será retornado:Mas não é tão fácil como mostrado nesses exemplos: objetos do mundo real podem conter números e caracteres alfabéticos ou até símbolos (por favor, não faça isso).
Aqui está um exemplo com todos eles em um objeto:
Agora, se usarmos
Array.prototype.sort()
na matriz acima, a saída será alterada:Aqui está uma citação dos documentos:
Você precisa garantir que um deles retorne a saída desejada para você. Nos exemplos da vida real, as pessoas tendem a misturar as coisas especialmente se você usar diferentes entradas de informações, como APIs e bancos de dados.
Então, qual é o grande problema?
Bem, existem dois artigos que todo programador deve entender:
Algoritmo no local :
Então, basicamente, nossa matriz antiga será substituída! Isso é importante se você deseja manter a matriz antiga por outros motivos. Portanto, mantenha isso em mente.
Algoritmo de classificação
Isso mostra que a classificação está correta, mas mudou. Portanto, no mundo real, mesmo que a classificação esteja correta, temos que garantir o que esperamos! Isso é super importante, lembre-se disso também. Para obter mais exemplos de JavaScript, consulte Array.prototype.sort () - docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
fonte
Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
.{5: 'hearts'}
ou{5: 'spades'}
você começar a classificar o array, ele se tornará potencialmente instável em jogos como o rummy. Para não falar de idiomas diferentes.Isso funciona para mim
fonte
É 2019 e temos uma maneira 2019 de resolver isso :)
fonte
aqui está o forro 1
fonte
(o[k] = v, o)
. Por que isso funciona, onde posso encontrar documentos sobre isso? Obviamente, ele retorna o parâmetro mais à direita, mas por quê?o[k]
igual av
e retornao
Esta é uma pergunta antiga, mas seguindo a sugestão da resposta de Mathias Bynens, fiz uma versão curta para classificar o objeto atual , sem muita sobrecarga.
após a execução do código, o próprio objeto "não ordenado" terá as chaves classificadas em ordem alfabética.
fonte
Usando o lodash, isso funcionará:
Apenas comida para pensar.
fonte
Suponha que possa ser útil no depurador do VisualStudio, que mostra propriedades não ordenadas do objeto.
fonte
Versão sublinhada :
Se você não confiar no seu navegador para manter a ordem das chaves, sugiro que confie em uma matriz ordenada de matrizes emparelhadas com valor-chave.
fonte
_.object(_.sortBy(_.pairs(unordered), _.first))
fonte
Talvez uma forma um pouco mais elegante:
PS e o mesmo com a sintaxe ES6 +:
fonte
classificação recursiva, para objetos e matrizes aninhados
fonte
else
lá - poderia ser verdade para ambosArray.isArray(obj[key])
e paratypeof obj[key] === 'object'
function sortObjectKeys(obj){
::if(typeof obj != 'object'){ /* it is a primitive: number/string (in an array) */ return obj; }
. Para maior robustez, no início completo, também adicionei:if(obj == null || obj == undefined){ return obj; }
Como já mencionado, os objetos não são ordenados.
Contudo...
Você pode achar útil esse idioma:
Você pode iterar através de kv e fazer o que quiser.
fonte
Aqui está uma versão limpa baseada em lodash que funciona com objetos aninhados
Seria ainda mais limpo se o lodash tivesse um
toObject()
método ...fonte
Basta usar o lodash para descompactar o mapa e classificar. Pelo primeiro valor do par e zip novamente, ele retornará a chave classificada.
Se você deseja classificar o valor, altere o índice do par para 1 em vez de 0
fonte
Classifica chaves recursivamente enquanto preserva as referências.
Exemplo:
fonte
delete o[e[0]];
lá? Não podemos simplesmente atribuir?fonte
Esta é uma solução leve para tudo o que preciso para a classificação JSON.
fonte
Use esse código se você tiver objetos aninhados ou se tiver objetos de matriz aninhados.
fonte
Solução:
Explicação:
Muitos tempos de execução do JavaScript armazenam valores dentro de um objeto na ordem em que são adicionados.
Para classificar as propriedades de um objeto por suas chaves, você pode usar a função Object.keys que retornará uma matriz de chaves. A matriz de chaves pode ser classificada pelo Array.prototype.sort () método que classifica os elementos de uma matriz no local (não é necessário atribuí-los a uma nova variável).
Depois que as chaves são classificadas, você pode começar a usá-las uma a uma para acessar o conteúdo do objeto antigo e preencher um novo objeto (que agora está classificado).
Abaixo está um exemplo do procedimento (você pode testá-lo nos navegadores de destino):
Nota: Object.keys é um método ECMAScript 5.1, mas aqui está um polyfill para navegadores mais antigos:
fonte
Transferi algumas enumerações Java para objetos javascript.
Esses objetos retornaram matrizes corretas para mim. se as chaves do objeto são do tipo misto (string, int, char), há um problema.
Mostrar snippet de código
fonte
Fragmento simples e legível, usando lodash.
Você precisa colocar a chave entre aspas apenas ao chamar sortBy. Ele não precisa estar entre aspas nos próprios dados.
Além disso, seu segundo parâmetro para mapear está errado. Deve ser uma função, mas o uso de arrancar é mais fácil.
fonte
Há um ótimo projeto de @sindresorhus chamado sort-keys que funciona de maneira incrível.
Você pode verificar seu código fonte aqui:
https://github.com/sindresorhus/sort-keys
Ou você pode usá-lo com o npm:
Aqui também estão exemplos de código de seu leia-me
fonte
Resposta JavaScript pura para classificar um Objeto. Esta é a única resposta que conheço que manipulará números negativos. Esta função é para classificar objetos numéricos.
Objeto de entrada = {1000: {}, -1200: {}, 10000: {}, 200: {}};
A saída será um objeto classificado por esses números com novas chaves começando em 0.
fonte
Apenas para simplificá-lo e deixar mais clara a resposta de Matt Ball
fonte
Não tenho certeza se isso responde à pergunta, mas é disso que eu precisava.
Chamado como:
fonte
A única linha:
fonte
a melhor maneira de fazer isso é
Você pode primeiro converter seu objeto quase do tipo matriz em uma matriz real e, em seguida, usar .reverse ():
O slot vazio no final se causa porque o seu primeiro índice é 1 em vez de 0. Você pode remover o slot vazio com .length-- ou .pop ().
Como alternativa, se você deseja emprestar .reverse e chamá-lo no mesmo objeto, ele deve ser um objeto totalmente do tipo matriz. Ou seja, ele precisa de uma propriedade length:
Observe que ele retornará o mesmo objeto de objeto totalmente de matriz, portanto não será uma matriz real. Você pode usar delete para remover a propriedade length.
fonte