utiliser Lodash pour trier un tableau d'objets par valeur

97

J'essaye de trier un tableau par valeur de «nom» (en utilisant Lodash). J'ai utilisé les documents Lodash pour créer la solution ci-dessous, cependant .orderBy ne semble pas avoir d'effet du tout. Quelqu'un peut-il nous éclairer sur la manière correcte de trier le tableau?

Tableau de caractères

[  
   {  
      "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"
   }
]

Code de fonction

 var chars = this.state.characters;

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

 this.setState({characters: chars})
Ariel
la source

Réponses:

190

Cette méthode orderByne modifie pas le tableau d'entrée, vous devez affecter le résultat à votre tableau:

var chars = this.state.characters;

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

 this.setState({characters: chars})
Artémis Jeune
la source
hmmm, ne semble toujours pas trier le tableau. Je ne sais pas si je dois mettre à jour la question ou en créer une nouvelle
1
Mise à jour de la réponse, peut-être que votre erreur est due au passage de deux paramètres au lieu d'un tableau pour'name', 'asc'
Artémis Young
1
" orderByne modifie pas le tableau d'entrée" ... " orderBymodifie le tableau en place." Le libellé prévu est probablement «pas en place» ou «hors de place». Voir: en.wikipedia.org/wiki/In-place_algorithm
Dem Pilafian
En fait, vous avez raison, je viens de supprimer cette phrase car elle n'ajoute rien à la réponse
Artémis Young
Ce deuxième paramètre ['asc']n'est pas d'ordre croissant, pour y parvenir, il faudrait ajouter un reverse()après le orderBy(au moins dans la version 4.17.15)
Diego Ortiz
60

Vous pouvez utiliser lodash sortBy ( https://lodash.com/docs/4.17.4#sortBy ).

Votre code pourrait être comme:

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
la source
32
Vous pouvez également utiliser la sténographie:_.sortBy(myArray, 'name')
Don
7
Par rapport à orderBy, vous ne pouvez pas passer le type de tri sortBy, il trie toujours par ordre croissant.
a_rahmanshah