Se eu tiver um objeto JavaScript como:
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
Existe uma maneira de classificar as propriedades com base no valor? Para que eu acabe com
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
javascript
sorting
properties
object
Steerpike
fonte
fonte
Object.entries
resposta mal votada, que é o estado da arte mais limpo e legível desde o ES2017: stackoverflow.com/a/37607084/245966Respostas:
Mova-os para uma matriz, classifique essa matriz e use-a para seus propósitos. Aqui está uma solução:
Depois de ter a matriz, você poderá reconstruir o objeto a partir da matriz na ordem que desejar, atingindo exatamente o que deseja fazer. Isso funcionaria em todos os navegadores que eu conheço, mas seria dependente de uma peculiaridade de implementação e poderia ser interrompida a qualquer momento. Você nunca deve fazer suposições sobre a ordem dos elementos em um objeto JavaScript.
fonte
keys()
é suportado apenas pelo IE9 + (e outros navegadores modernos), se isso for motivo de preocupação. Tambémkeys()
exclui propriedades enumeráveis da cadeia de protótipos dos elementos (diferente de..in) - mas isso geralmente é mais desejável._.pairs
transforma um objeto em [[chave1, valor1], [chave2, valor2]]. Então chame uma ordem sobre isso. Depois, ligue_.object
-o para voltar.Não queremos duplicar toda a estrutura de dados ou usar uma matriz em que precisamos de uma matriz associativa.
Aqui está outra maneira de fazer a mesma coisa que bonna:
fonte
keysSorted
é uma matriz! Não é um objeto!.map(key => list[key]);
ao final da classificação, ele retornará o objeto inteiro em vez de apenas a chaveSeus objetos podem ter qualquer quantidade de propriedades e você pode optar por classificar por qualquer propriedade de objeto que desejar, número ou sequência, se colocar os objetos em uma matriz. Considere esta matriz:
ordenar por data de nascimento, mais antiga primeiro
ordenar por nome
http://jsfiddle.net/xsM5s/16/
fonte
substr
sair do primeiro caractere; maisDiana
eDebra
ter uma ordem indefinida. Além disso, suabyDate
classificação realmente usanum
, nãoborn
.x.localeCompare(y)
localCompare
parece uma função muito útil! Observe que ele não será suportado em todos os navegadores - IE 10 e menos, Safari Mobile 9 e menos.Para completar, essa função retorna uma matriz classificada de propriedades do objeto:
O Jsfiddle com o código acima está aqui . Esta solução é baseada neste artigo .
O violino atualizado para classificar strings está aqui. Você pode remover ambas as conversões adicionais .toLowerCase () para comparação de cadeias que diferenciam maiúsculas de minúsculas.
fonte
Introduz ECMAScript 2017
Object.values / Object.entries
. Como o nome sugere, o primeiro agrega todos os valores de um objeto em uma matriz, e o último faz o objeto inteiro em uma matriz de[key, value]
matrizes; O equivalente em Python dedict.values()
edict.items()
.Os recursos tornam muito mais fácil classificar qualquer hash em um objeto ordenado. A partir de agora, apenas uma pequena parte das plataformas JavaScript as suporta , mas você pode experimentá-lo no Firefox 47 ou superior.
fonte
Sorting JavaScript Object by property value
? você entendeu mal a pergunta, pois você deve alterar o objeto original e não criar uma nova matriz a partir dele.Uma versão "em flecha" da resposta de @marcusR para referência
ATUALIZAÇÃO: abril de 2017 - Retorna um
myObj
objeto classificado definido acima.Experimente aqui!
ATUALIZAÇÃO: outubro de 2018 - versão Object.entries
Experimente aqui!
fonte
var myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
entries
. De acordo com o padrão, um objeto é uma coleção não ordenada de propriedades . Bem, isso significa que se você estiver tentando construir o novo objeto depois de classificá-lo por valor da propriedade ou qualquer outra coisa, a ordem das chaves de propriedade se tornará indefinida novamente. O Chrome, por exemplo, está ordenando por padrão as chaves de propriedade; portanto, todas as tentativas de solicitá-las de maneira diferente são inúteis. Sua única chance é obter um "índice" com base nas suas preferências de pedido e percorrer o objeto original de acordo.sort()
emObject.entries()
Os objetos JavaScript não são ordenados por definição (consulte a Especificação de idioma do ECMAScript , seção 8.6). A especificação da linguagem nem garante que, se você iterar sobre as propriedades de um objeto duas vezes seguidas, elas serão exibidas na mesma ordem na segunda vez.
Se você precisar solicitar itens, use uma matriz e o método Array.prototype.sort.
fonte
OK , como você deve saber, o javascript possui sort () função , para ordenar matrizes, mas nada para o objeto ...
Portanto, nesse caso, precisamos, de alguma forma, obter a matriz das chaves e classificá-las, e é por isso que a API fornece objetos em uma matriz na maioria das vezes, porque a matriz tem mais funções nativas para brincar com elas do que o objeto literal, de qualquer maneira, a solução rápida está usando Object.key, que retorna uma matriz das chaves de objeto, eu crio a função ES6 abaixo, que faz o trabalho para você, ele usa funções nativas de classificação () e de redução () em javascript:
E agora você pode usá-lo assim:
Verifique o selectedMyObject e você poderá ver o resultado classificado por chaves como esta:
Além disso, o objeto principal não será tocado e, na verdade, estamos recebendo um novo objeto.
Também crio a imagem abaixo, para tornar as etapas da função mais claras, caso você precise alterá-la um pouco para que funcione do seu jeito:
fonte
c: 3
parac: 13
e você verá desmoronar.fonte
Atualização com o ES6: se sua preocupação é ter um objeto classificado para percorrer (e é por isso que eu imagino que você deseja que suas propriedades sejam classificadas), você pode usar o objeto Map .
Você pode inserir seus pares (chave, valor) na ordem classificada e, em seguida, fazer um
for..of
loop garantirá que eles façam loop na ordem em que foram inseridosfonte
for-in
ouObject.keys
, mas está definido para ser respeitado porObject.getOwnPropertyNames
e pelos outros novos métodos para acessar matrizes de nomes de propriedades. Então essa é outra opção.Map
você, na verdade , você tem uma estrutura de dados que pode armazenar em ordem classificada (classifique seus dados, faça um loop e armazene-os no mapa) onde, como você não está garantido, objetos.Underscore.js ou Lodash.js para classificações avançadas de matriz ou objeto
demonstração
fonte
Muito curto e simples!
fonte
Estou seguindo a solução dada por slebetman (leia-a para todos os detalhes), mas ajustada, pois seu objeto não está aninhado.
fonte
Classificar valores sem vários for-loops (para classificar pelas chaves, altere o índice no retorno de chamada de classificação para "0")
fonte
Essa poderia ser uma maneira simples de lidar com isso como um objeto real ordenado. Não tenho certeza de quão lento é. também pode ser melhor com um loop while.
E então eu encontrei essa função invertida em: http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/
assim
fonte
saída = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]
fonte
Por precaução, alguém está procurando manter o objeto (com chaves e valores), usando a referência de código por @Markus R e o comentário de @James Moran, basta usar:
fonte
map
,forEach
seria melhor #Resultado:
fonte
muitas funções semelhantes e úteis: https://github.com/shimondoodkin/groupbyfunctions/
fonte
Objeto classificado por valor (DESC)
fonte
Aqui está mais um exemplo:
fonte
fonte
TypeScript
A função a seguir classifica o objeto por valor ou uma propriedade do valor. Se você não usar o TypeScript, poderá remover as informações de tipo para convertê-las em JavaScript.
Uso
A ordem das chaves em um objeto JavaScript não é garantida, por isso estou classificando e retornando o resultado como um
Map
objeto que preserva a ordem de classificação.Se você deseja convertê-lo novamente em Object, pode fazer o seguinte:
fonte
input é objeto, output é objeto, usando a lib embutida lodash & js, com opção descendente ou ascendente, e não altera o objeto de entrada
por exemplo, entrada e saída
A implementação
fonte
fonte
minha solução com sort:
fonte
fonte
Outra maneira de resolver isso: -
// res terá a matriz de resultados
fonte
Obrigado e continue a responder @Nosredna
Agora que entendemos que o objeto precisa ser convertido em matriz, classifique a matriz. isso é útil para classificar a matriz (ou objeto convertido em matriz) por string:
fonte
Tente isso. Mesmo o seu objeto não possuir a propriedade com base na qual você está tentando classificar também será tratado.
Basta chamá-lo enviando propriedade com objeto.
fonte