Eu tenho uma matriz de objetos com vários pares de valores-chave e preciso classificá-los com base em 'updated_at':
[
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
]
Qual é a maneira mais eficiente de fazer isso?
javascript
arrays
object
monstro de biscoito
fonte
fonte
Respostas:
Você pode usar
Array.sort
.Aqui está um exemplo:
fonte
keyA - keyB
(ou possivelmentekeyB - keyA
)? Os objetos de data têm umvalueOf()
métodoa-b
é realmente importante se você deseja evitar códigos longos. Embora o código longo não seja necessariamente ruim neste caso, acho que a verbosidade torna mais difícil de entender. Eu uso atualmentevalues.sort((a,b)=>a.attr-b.attr)
. Ter que escrever 5 linhas toda vez que você precisar classificar uma matriz se torna entediante.Eu já respondi uma pergunta realmente semelhante aqui: Função simples para classificar uma matriz de objetos
Para essa pergunta, criei esta pequena função que pode fazer o que você deseja:
fonte
-1
:)array = array.reverse()
funçãoO método Array.sort () classifica os elementos de uma matriz no local e retorna a matriz. Tenha cuidado com Array.sort (), pois não é imutável . Para classificação imutável, use classificação imutável .
Este método é para classificar a matriz usando sua corrente
updated_at
no formato ISO. Usamosnew Data(iso_string).getTime()
para converter o tempo ISO em carimbo de data e hora do Unix. Um registro de data e hora do Unix é um número no qual podemos fazer contas simples. Subtraímos o primeiro e o segundo registro de data e hora do resultado; se o primeiro registro de data e hora for maior que o segundo, o número de retorno será positivo. Se o segundo número for maior que o primeiro, o valor de retorno será negativo. Se os dois forem iguais, o retorno será zero. Isso combina perfeitamente com os valores de retorno necessários para a função embutida.Para ES6 :
Para ES5 :
Se você alterar seu
updated_at
registro de data e hora para unix, poderá fazer o seguinte:Para ES6 :
Para ES5 :
No momento desta publicação, os navegadores modernos não eram compatíveis com o ES6. Para usar o ES6 em navegadores modernos, use babel para transpilar o código para o ES5. Espere suporte do navegador para ES6 em um futuro próximo.
Array.sort () deve recuperar um valor de retorno de um dos três resultados possíveis:
Para classificação imutável: (exemplo no ES6)
Você também pode escrever desta maneira:
A importação de que você vê é uma nova maneira de incluir javascript no ES6 e torna seu código muito limpo. Meu favorito pessoal.
A classificação imutável não altera a matriz de origem, mas retorna uma nova matriz.
const
É recomendável usar dados imutáveis.fonte
Aqui está uma versão ligeiramente modificada da resposta do @David Brainer-Bankers, que classifica alfabeticamente por sequência de caracteres ou numericamente por número e garante que as palavras que começam com maiúsculas não sejam classificadas acima das que começam com minúscula (por exemplo, "maçã, cedo" seria exibido nessa ordem).
fonte
Use sublinhado js ou lodash,
_.sortBy()
retorna uma nova matrizconsulte http://underscorejs.org/#sortBy e lodash docs https://lodash.com/docs#sortBy
fonte
Com o suporte do ES2015, isso pode ser feito por:
fonte
new Date(iso_str).getTime()
isso retornará um carimbo de data / hora do Unix.Dados Importados
FOR ordem crescente
Exemplo para ordem asc
FOR Ordem decrescente
Exemplo para ordem desc
fonte
Como afirma esta resposta, você pode usar
Array.sort
.arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})
fonte
Apenas outra maneira, mais matemática , de fazer a mesma coisa, mas mais curta :
ou no estilo liso da seta lambda:
Este método pode ser feito com qualquer entrada numérica
fonte
Hoje, as respostas de @knowbody ( https://stackoverflow.com/a/42418963/6778546 ) e @Rocket Hazmat ( https://stackoverflow.com/a/8837511/6778546 ) podem ser combinadas para fornecer suporte ao ES2015 e manuseio correto da data:
fonte
Eu criei uma função de classificação no TypeScript que podemos usar para pesquisar seqüências de caracteres, datas e números na matriz de objetos. Também pode classificar em vários campos.
Uso:
fonte
A classificação por uma data formatada em ISO pode ser cara, a menos que você limite os clientes aos melhores e mais recentes navegadores, que podem criar o carimbo de data / hora correto ao analisar a sequência por data.
Se você tem certeza de sua entrada e sabe que sempre será aaaa-mm-ddThh: mm: ss e GMT (Z), você pode extrair os dígitos de cada membro e compará-los como números inteiros
Se a data puder ser formatada de maneira diferente, talvez você precise adicionar algo para as pessoas iso desafiadas:
fonte
Date.parse
?Para completar, aqui está uma possível implementação genérica curta de sortBy:
Observe que isso usa o método de classificação de matrizes que classifica no local. para uma cópia, você pode usar o método arr.concat () ou arr.slice (0) ou similar para criar uma cópia.
fonte
Com isso, podemos passar uma função chave para usar na classificação
Então, por exemplo, se tivermos
Nós podemos fazer
ou
ou
fonte
Você pode usar a biblioteca de utilitários Lodash para resolver esse problema (é uma biblioteca bastante eficiente):
Você pode encontrar documentação aqui: https://lodash.com/docs/4.17.15#orderBy
fonte
Você pode criar um fechamento e passá-lo dessa maneira, aqui está o meu exemplo trabalhando
fonte
fonte
Array.sort()
para classificar uma matriz…
) para tornar a função puraupdated_at
)Array.sort()
funciona subtraindo duas propriedades do item atual e do próximo, se for um número / objeto no qual você pode executar operações arrítmicasfonte
Eu enfrento a mesma coisa, então eu manejo isso com um porquê genérico e construo uma função para isso:
fonte