Лодаш: як зробити сортування без урахування регістру колекції за допомогою orderBy?


87

Я перевірив цю відповідь, але для досягнення того самого результату, тобто для отримання сортування, що не враховує регістр, мені потрібно використовувати orderByзамість, sortByоскільки це дає можливість вказати порядок сортування .

Єдиний спосіб, який я знайшов для досягнення цього, - це створити клонований "середній" масив, зіставлений у нижній регістр 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);

Це здається справді дорогим, і воно буде навіть складнішим із кількома назвами сортувань та динамічних властивостей.

Чи є краща ідея?


Ось Планкер: https://plnkr.co/edit/i1ywyxjFctuNfHtPTcgG

Відповіді:


188

У документації зазначено, що ви можете передавати функцію як "ітератор":

[ітерати = [_. ідентичність]] (Масив [] | Функція [] | Об'єкт [] | рядок []): Ітерати, за якими потрібно сортувати.

Отже, ви можете це зробити

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
Це може не вдатися у старих браузерах.
парогенератор

14
Якщо ви маєте на увазі, що це спричинить синтаксичну помилку у браузері, який не підтримує ES6, тоді так, звичайно. Я залишу перетворення функції стрілки на "звичайну" функцію (і constна var) як вправу для читача.
Фелікс Клінг,

@TheCaptan: немає жодної причини, чому б це не сталося.
Фелікс Клінг,

2
Я намагаюся запитати @ TheCaptan наступним чином, але отримую помилку компілятора:const sortedUsers = _.orderBy(users, [user => user[propToSort].toLowerCase()], ['desc']);
im1dermike

1
@ im1dermike: ви, мабуть, хочете скористатися .toString()перед викликом у нижній регістр там, крім того, якщо ви хочете використовувати property.somethingдля propToSort та подібних, які ви можете використовувати _.get(user, propToSort)(можливо, це допоможе комусь іншому)
Соніку

10

Впорядкування за кількома властивостями:

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

Ви можете поєднати приклад Фелікса Клінга з функцією _.get для сортування за динамічними вкладеними атрибутами:

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()]);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.