Lodash: come eseguire un ordinamento senza distinzione tra maiuscole e minuscole su una raccolta utilizzando orderBy?


90

Ho controllato questa risposta ma per ottenere lo stesso risultato, ovvero ottenere un ordinamento senza distinzione tra maiuscole e minuscole, devo usare orderByinvece di sortBypoiché dà la possibilità di specificare l'ordinamento .

L'unico modo che ho trovato per ottenerlo è stato creare un array "medio" clonato mappato in minuscolo 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);

Questo sembra molto costoso e sarà anche più complesso con più ordinamenti e nomi di proprietà dinamiche.

C'è un'idea migliore?


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

Risposte:


190

La documentazione specifica che puoi passare una funzione come "iteratee":

[iteratees = [_. identity]] (Array [] | Function [] | Object [] | string []): gli iterate in base ai quali ordinare.

Quindi puoi farlo

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
Questo potrebbe non riuscire sui browser meno recenti.
Steampowered

16
Se intendi che questo genererà un errore di sintassi nel browser che non supporta ES6, allora sì, ovviamente. Lascerò la conversione della funzione freccia in una funzione "normale" (e constin var) come esercizio per il lettore.
Felix Kling

@TheCaptan: non c'è motivo per cui non dovrebbe.
Felix Kling,

2
Sto tentando la domanda di @ TheCaptan con quanto segue, ma ricevo un errore del compilatore:const sortedUsers = _.orderBy(users, [user => user[propToSort].toLowerCase()], ['desc']);
im1dermike

1
@ im1dermike: probabilmente vuoi usare .toString()prima di chiamare in minuscolo lì, inoltre se vuoi usare property.somethingper propToSort e simili puoi usare _.get(user, propToSort)(forse questo aiuterà qualcun altro)
Soniku

10

Ordinamento per più proprietà:

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'])

2

Puoi combinare l'esempio di Felix Kling con la funzione _.get per ordinare per attributi nidificati dinamici:

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()]);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.