Lodash: bagaimana melakukan penyortiran case insensitive pada koleksi menggunakan orderBy?

90

Saya memeriksa jawaban ini tetapi untuk mencapai hasil yang sama, yaitu untuk mendapatkan pengurutan tidak peka huruf besar / kecil, saya perlu menggunakan orderByalih-alih sortBykarena ini memberikan kemampuan untuk menentukan urutan pengurutan .

Satu-satunya cara yang saya temukan untuk mencapainya adalah dengan membuat kloning "tengah" array yang dipetakan ke huruf kecil 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);

Tampaknya ini sangat mahal dan bahkan akan menjadi lebih kompleks dengan beberapa penyortiran dan nama properti dinamis.

Apakah ada ide yang lebih baik?


Berikut ini Plunker: https://plnkr.co/edit/i1ywyxjFctuNfHtPTcgG

WhiteEleven
sumber

Jawaban:

190

The dokumentasi menetapkan bahwa Anda dapat melewati fungsi sebagai "iteratee":

[iteratees = [_. identity]] (Array [] | Function [] | Object [] | string []): Iterasi yang akan diurutkan.

Jadi Anda bisa melakukannya

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>

Felix Kling
sumber
2
Ini mungkin gagal di browser lama.
steampowered
16
Jika Anda bermaksud bahwa ini akan memunculkan kesalahan sintaks di browser yang tidak mendukung ES6, maka ya, tentu saja. Saya akan membiarkan mengubah fungsi panah menjadi fungsi "normal" (dan constke var) sebagai latihan bagi pembaca.
Felix Kling
@TheCaptan: tidak ada alasan mengapa tidak.
Felix Kling
2
Saya mencoba pertanyaan @ TheCaptan dengan yang berikut, tetapi mendapatkan kesalahan kompiler:const sortedUsers = _.orderBy(users, [user => user[propToSort].toLowerCase()], ['desc']);
im1dermike
1
@ im1dermike: Anda mungkin ingin menggunakan .toString()sebelum menelepon ke huruf kecil di sana, selain itu jika Anda ingin menggunakan property.somethingpropToSort dan sejenisnya, Anda dapat menggunakan _.get(user, propToSort)(mungkin ini akan membantu orang lain)
Soniku
10

Mengurutkan berdasarkan beberapa properti:

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'])
MaxineHu
sumber
2

Anda dapat menggabungkan contoh Felix Kling dengan fungsi _.get untuk mengurutkan berdasarkan atribut bertingkat dinamis:

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()]);
Agustí Sánchez
sumber