use Lodash para ordenar la matriz de objetos por valor

97

Estoy tratando de ordenar una matriz por valor de 'nombre' (usando Lodash). Utilicé los documentos de Lodash para crear la solución a continuación, sin embargo .orderBy no parece tener ningún efecto en absoluto. ¿Alguien puede arrojar algo de luz sobre la forma correcta de ordenar la matriz?

Matriz de caracteres

[  
   {  
      "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 función

 var chars = this.state.characters;

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

 this.setState({characters: chars})
ariel
fuente

Respuestas:

191

Este método orderByno cambia la matriz de entrada, debe asignar el resultado a su matriz:

var chars = this.state.characters;

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

 this.setState({characters: chars})
Artémis joven
fuente
hmmm, todavía no parece ordenar la matriz. No estoy seguro de si debería actualizar la pregunta o hacer una nueva
1
Se actualizó la respuesta, tal vez su error se deba a pasar dos parámetros en lugar de una matriz para'name', 'asc'
Artémis Young
1
" orderByno cambia la matriz de entrada" ... " orderBycambia la matriz en su lugar". La redacción prevista es probablemente "fuera de lugar" o "fuera de lugar". Ver: en.wikipedia.org/wiki/In-place_algorithm
Dem Pilafian
En realidad, tiene razón, acabo de eliminar esta oración ya que no agrega nada a la respuesta
Artémis Young
Ese segundo parámetro ['asc']no ordena ascendente, para lograr eso la forma sería agregar un reverse()después del orderBy(al menos en la versión 4.17.15)
Diego Ortiz
60

Puede usar lodash sortBy ( https://lodash.com/docs/4.17.4#sortBy ).

Tu código podría ser como:

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
fuente
32
También puede utilizar la taquigrafía:_.sortBy(myArray, 'name')
Don
7
En comparación con orderBy, no se puede pasar el tipo de clasificación sortBy, siempre se clasifica en orden ascendente.
a_rahmanshah