Lodash: làm thế nào để phân loại không phân biệt chữ hoa chữ thường trên một tập hợp bằng orderBy?


88

Tôi đã kiểm tra câu trả lời này nhưng để đạt được kết quả tương tự, đó là để có được phân loại không phân biệt chữ hoa chữ thường, tôi cần sử dụng orderBythay sortBynó cho khả năng chỉ định thứ tự sắp xếp .

Cách duy nhất tôi tìm thấy để đạt được điều đó là tạo một mảng "giữa" được sao chép được ánh xạ thành chữ thường 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);

Điều này có vẻ thực sự tốn kém và thậm chí nó sẽ phức tạp hơn với nhiều phân loại và tên thuộc tính động.

Có một ý tưởng tốt hơn?


Đây là một Plunker: https://plnkr.co/edit/i1ywyxjFctuNfHtPTcgG

Câu trả lời:


189

Các tài liệu quy định cụ thể mà bạn có thể vượt qua một chức năng như "iteratee":

[iteratees = [_. ID]] (Array [] | Function [] | Object [] | string []): Các bước lặp để sắp xếp theo.

Vì vậy, bạn có thể làm

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
Điều này có thể không thành công trên các trình duyệt cũ hơn.
steampowered

15
Nếu bạn muốn nói rằng điều này sẽ gây ra lỗi cú pháp trong trình duyệt không hỗ trợ ES6, thì tất nhiên là có. Tôi sẽ chuyển đổi hàm mũi tên thành hàm "bình thường" (và constthành var) như một bài tập cho người đọc.
Felix Kling,

@TheCaptan: không có lý do gì mà không nên.
Felix Kling

2
Tôi đang cố gắng @ câu hỏi TheCaptan với những điều sau đây, nhưng nhận được một lỗi biên dịch:const sortedUsers = _.orderBy(users, [user => user[propToSort].toLowerCase()], ['desc']);
im1dermike

1
@ im1dermike: có thể bạn muốn sử dụng .toString()trước khi gọi thành chữ thường ở đó, bổ sung nếu bạn muốn sử dụng property.somethingcho propToSort và tương tự bạn có thể sử dụng _.get(user, propToSort)(có lẽ đây sẽ giúp đỡ người khác)
Soniku

10

Sắp xếp theo nhiều thuộc tính:

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

Bạn có thể kết hợp ví dụ Felix Kling với hàm _.get để sắp xếp theo các thuộc tính lồng nhau động:

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()]);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.