2016-06-16 14 views
26

ho controllato this answer ma per ottenere lo stesso risultato, che è quello di ottenere l'ordinamento case-insensitive, ho bisogno di usare orderBy invece di sortBy dal dà la possibilità di specificare il tipo di ordinamento.Lodash: come fare un ordinamento senza distinzione tra maiuscole e minuscole di una raccolta utilizzando orderBy?

L'unico modo che ho trovato per raggiungerlo è stato quello di creare un clonato serie "middle" mappato in minuscolo la 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 veramente costoso, e sarà ancora più complesso con più cernite e nomi di proprietà dinamiche.

Esiste un'idea migliore?


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

risposta

66

Il documentation specifica che è possibile passare una funzione come "iteratee":

[iteratees=[_.identity]] (Array[]|Function[]|Object[]|string[]): The iteratees to sort by.

modo da poter fare

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>

+1

Questo potrebbe non riuscire sui browser più vecchi. – steampowered

+4

Se si intende che questo genererà un errore di sintassi nel browser che non supporta ES6, quindi sì, ovviamente. Lascerò la conversione della funzione di freccia in una funzione "normale" (e 'const' a' var') come esercizio per il lettore. –

+0

Funziona con nomi di proprietà dinamici? – TheCaptan

Problemi correlati