124 votes

Lodash : comment faire un tri insensible à la casse sur une collection en utilisant orderBy ?

J'ai vérifié cette réponse mais pour obtenir le même résultat, c'est-à-dire pour obtenir un tri insensible à la casse, je dois utiliser orderBy au lieu de sortBy depuis il donne la possibilité de spécifier l'ordre de tri .

La seule façon que j'ai trouvée pour y parvenir a été de créer un tableau cloné "du milieu" mappé sur les minuscules, le tableau name :

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
];

let lowerCaseUsers = _.clone(users);

lowerCaseUsers = lowerCaseUsers.map((user) => {
  user.name = user.name.toLowerCase();
  return user;
});

const sortedUsers = _.orderBy(lowerCaseUsers, ['name'], ['desc']);

console.log(sortedUsers);

Cela semble vraiment coûteux et ce sera encore plus complexe avec des tris multiples et des noms de propriétés dynamiques.

Y a-t-il une meilleure idée ?


Voici un Plunker : https://plnkr.co/edit/i1ywyxjFctuNfHtPTcgG

246voto

Felix Kling Points 247451

Le site documentation spécifie que vous pouvez passer une fonction comme "iteratee" :

[iteratees=[_.identity]] (Tableau[]|Fonction[]|Objet[]|Chaîne[]) : Les itérations à trier.

Donc vous pouvez faire

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
];

const sortedUsers = _.orderBy(users, [user => user.name.toLowerCase()], ['desc']);
console.log(sortedUsers);

<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

2 votes

Cette opération peut échouer sur les anciens navigateurs.

23 votes

Si vous voulez dire que cela entraînera une erreur de syntaxe dans les navigateurs ne supportant pas ES6, alors oui, bien sûr. Je laisserai la conversion de la fonction flèche en une fonction "normale" (et la fonction const à var ) comme exercice pour le lecteur.

0 votes

@TheCaptan : il n'y a aucune raison pour que ce ne soit pas le cas.

25voto

MaxineHu Points 161

Classement par propriétés multiples :

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
]

const nameSorter = user => user.name.toLowerCase()
const ageSorter = 'age'

const sortedUsers = _.orderBy(users, [nameSorter, ageSorter], ['desc', 'asc'])

8voto

Agustí Sánchez Points 250

Vous pouvez combiner l'exemple de Felix Kling avec la fonction _.get pour trier par attributs dynamiques imbriqués :

const _ = require('lodash');

let test = [{ a: {b:'AA'}},{a: {b:'BB'} }, {a: {b: 'bb'}}, {a:{b:'aa'}}];

let attrPath = 'a.b';

_.orderBy(test, [item => _.get(item, attrPath).toLowerCase()]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X