use Lodash para classificar a matriz de objeto por valor

96

Estou tentando classificar uma matriz por valor de 'nome' (usando Lodash). Usei os documentos Lodash para criar a solução abaixo, no entanto .orderBy não parece ter nenhum efeito. Alguém pode lançar alguma luz sobre a maneira correta de ordenar a matriz?

Matriz de Chars

[  
   {  
      "id":25,
      "name":"Anakin Skywalker",
      "createdAt":"2017-04-12T12:48:55.000Z",
      "updatedAt":"2017-04-12T12:48:55.000Z"
   },
   {  
      "id":1,
      "name":"Luke Skywalker",
      "createdAt":"2017-04-12T11:25:03.000Z",
      "updatedAt":"2017-04-12T11:25:03.000Z"
   }
]

Código de Função

 var chars = this.state.characters;

 _.orderBy(chars, 'name', 'asc'); // Use Lodash to sort array by 'name'

 this.setState({characters: chars})
Ariel
fonte

Respostas:

189

Este método orderBynão altera a matriz de entrada, você deve atribuir o resultado à sua matriz:

var chars = this.state.characters;

chars = _.orderBy(chars, ['name'],['asc']); // Use Lodash to sort array by 'name'

 this.setState({characters: chars})
Artémis Young
fonte
hmmm, ainda não parece classificar a matriz. Não tenho certeza se devo atualizar a pergunta ou fazer uma nova
1
Atualizado a resposta, talvez seu erro seja devido a passar dois parâmetros em vez de uma matriz para'name', 'asc'
Artémis Young
1
" orderBynão altera a matriz de entrada" ... " orderByaltera a matriz no local." O texto pretendido provavelmente é "não no local" ou "fora do lugar". Veja: en.wikipedia.org/wiki/In-place_algorithm
Dem Pilafian
Na verdade, você está certo, acabei de remover esta frase, pois não acrescentou nada à resposta
Artémis Young
Esse segundo parâmetro ['asc']não ordena de forma ascendente, para isso o jeito seria adicionar a reverse()após orderBy(pelo menos na versão 4.17.15)
Diego Ortiz
58

Você pode usar lodash sortBy ( https://lodash.com/docs/4.17.4#sortBy ).

Seu código pode ser assim:

const myArray = [  
   {  
      "id":25,
      "name":"Anakin Skywalker",
      "createdAt":"2017-04-12T12:48:55.000Z",
      "updatedAt":"2017-04-12T12:48:55.000Z"
   },
   {  
      "id":1,
      "name":"Luke Skywalker",
      "createdAt":"2017-04-12T11:25:03.000Z",
      "updatedAt":"2017-04-12T11:25:03.000Z"
   }
]

const myOrderedArray = _.sortBy(myArray, o => o.name)
Caio santos
fonte
32
Você também pode usar a abreviação:_.sortBy(myArray, 'name')
Don
5
Em comparação com orderBy, você não pode passar o tipo de classificação sortBy, ele sempre classifica em ordem crescente.
a_rahmanshah