Eu tenho uma matriz (veja abaixo para um objeto na matriz) que eu preciso classificar por nome usando JavaScript. Como eu posso fazer isso?
var user = {
bio: null,
email: "[email protected]",
firstname: "Anna",
id: 318,
lastAvatar: null,
lastMessage: null,
lastname: "Nickson",
nickname: "anny"
};
javascript
Jonathan Clark
fonte
fonte
Respostas:
Suponha que você tenha uma matriz
users
. Você pode usarusers.sort
e passar uma função que recebe dois argumentos e os compara (comparador)Deve retornar
No nosso caso, se dois elementos existirem
a
eb
queremos comparara.firstname
eb.firstname
Exemplo:
Este código funcionará com qualquer tipo.
Observe que, na "vida real" ™, você frequentemente deseja ignorar maiúsculas e minúsculas, classificar corretamente sinais diacríticos, símbolos estranhos como ß etc. quando comparar seqüências de caracteres, portanto, pode usar
localeCompare
. Veja outras respostas para maior clareza.fonte
localeCompare
.O menor código possível com o ES6!
O suporte básico String.prototype.localeCompare () é universal!
fonte
Algo assim:
fonte
'a'>'A' //true
'z'>'a' //true
'A'>'z' //false
'Zebra'
mais alta que a string'apple'
, o que será feito se você não usar o.toLowerCase()
.'Z' < 'a' // true
e'z' < 'a' // false
Se as cadeias comparadas contiverem caracteres unicode, você poderá usar a
localeCompare
função deString
classe da seguinte maneira:fonte
users.sort((a, b) => a.name.localeCompare(b.name))
Nice little ES6 one liner:
fonte
Podemos usar o localeCompare, mas também precisamos verificar as chaves quanto aos valores de falsey
O código abaixo não funcionará se uma entrada estiver com lname ausente.
Então, precisamos verificar o valor de Falsey como abaixo
OU
podemos usar lodash, é muito simples. Ele detectará os valores retornados, ou seja, número ou sequência e fará a classificação de acordo.
https://lodash.com/docs/4.17.5#sortBy
fonte
O underscorejs oferece a muito boa função _.sortBy:
ou você pode usar uma função de classificação personalizada:
fonte
sortBy
detectar os valores devolvidos são cadeias e, portanto, realiza uma classificação alfabética? ObrigadoEm caso estamos classificando nomes ou algo com caracteres especiais, como ñ ou AEIOU (commons em espanhol) nós poderíamos usar o params locales ( es para o espanhol, neste caso) e opções como este:
As opções oficiais de localidade podem ser encontradas aqui em iana , es (espanhol), de (alemão), fr (francês). Sobre a sensibilidade base significa:
fonte
Basicamente, você pode classificar matrizes com o método sort, mas se você quiser classificar objetos, precisará passar a função para classificar o método do array, portanto, darei um exemplo usando seu array
fonte
else
ser removido? Caso contrário, issoreturn 0
nunca será lidoInspirado nesta resposta,
fonte
Uma notação mais compacta:
fonte
sign(f(a, b)) =-sign(f(b, a))
(para a = b)a.firstname == b.firstname
deve usar===
para completudetambém para classificação asec e desc, você pode usar isso: suponha que tenhamos uma variável SortType que especifica a classificação crescente ou a classificação descendente desejada:
fonte
Uma função generalizada pode ser escrita como abaixo
você pode passar os parâmetros abaixo
fonte
tentar
Mostrar snippet de código
fonte
[9,8,7,6,5,1,2,3].sort((a,b) => a<b ? -1 : 1)
Você pode usar isso para objetos
fonte
em palavras simples, você pode usar esse método
fonte
Você pode usar o método de matriz incorporado -
sort
. Esse método usa um método de retorno de chamada como um parâmetroPontos principais a serem observados para a compreensão deste código.
myCustomSort
deve retornar +1 ou -1 para cada comparação de pares de elementos (da matriz de entrada).toLowerCase()
/toUpperCase()
no método de retorno de chamada de classificação personalizado, para que a diferença entre maiúsculas e minúsculas não afete a correção do processo de classificação.Espero que esta seja uma explicação suficientemente clara. Sinta-se livre para comentar se você acha que são necessárias mais informações.
Felicidades!
fonte
Introduziu as principais respostas em um protótipo para classificar por chave.
fonte
Você pode usar algo semelhante, para se livrar da distinção entre maiúsculas e minúsculas
fonte
Minha implementação, funciona muito bem em versões mais antigas do ES:
fonte
Apenas para o registro, se você deseja ter uma função de classificação nomeada, a sintaxe é a seguinte:
Observe que o seguinte NÃO funciona:
fonte