lodash багатоколонний сорт


151

Існує чудовий метод сортування масиву об’єктів на основі кількох властивостей:

var data = _.sortBy(array_of_objects, ['type', 'name']);

Однак це лише для висхідного сортування. Чи є якийсь зручний спосіб визначення напрямку на стовпець? Напр

var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);

Відповіді:


329

Станом на lodash 3.5.0 ви можете використовувати sortByOrder (перейменований orderBy в v4.3.0):

var data = _.sortByOrder(array_of_objects, ['type','name'], [true, false]);

З версії 3.10.0 ви навіть можете використовувати стандартну семантику для замовлення (asc, desc):

var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);

У версії 4 lodash цей метод був перейменований в orderBy :

var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);

7
Для вашої інформації, ця функція була перейменована на _.orderBy ( lodash.com/docs#orderBy ) у Лодаші станом на 4.3.0. Функція звичайного сортування називається _.sortBy ( lodash.com/docs#sortBy )
Нідхін Девід,

2
Я отримую _.sortByOrder is not a functionостанню версію lodash.
чови

66
Чому lodash зберігає функції перейменування?
Кенні Worden

13
, ['asc', 'desc']Частина просто отримувати ігнорується для мене lodash@4.17.10. Все просто відсортовано за зростанням.
maninak

4
@maninak Це для _.sortBy. Спробуйте _.orderByзамість цього. Сподіваюся, це допомагає.
pcasme

45

Ви завжди можете використовувати Array.prototype.reverse()

var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();

га це розумно. для числового сортування за зростанням (дефолти заданих по дедашках за спаданням) я використав це: _.sortBy (array_of_objects, "some_numerical_value_key"). reverse ()
devonj

3
Хоча для деяких випадків достатньо добре, ефект цього полягає в сортуванні спадних стовпців ВІД, чого не задається питанням.
Інкінг

Підкажіть, будь ласка, відповідь? stackoverflow.com/questions/62611489 / ...
reacg garav

14

Варто зазначити, що якщо ви хочете сортувати певні властивості за спаданням, ви не хочете просто додавати .reverse () наприкінці, оскільки це призведе до зменшення всіх видів.

Щоб зробити окремі сорти за спаданням, ланцюгайте свої сорти від найменш значущих до найбільш значущих, викликаючи .reverse () після кожного сортування, який ви бажаєте зійти.

var data = _(data).chain()
    .sort("date")
    .reverse()    // sort by date descending
    .sort("name") // sort by name ascending
    .result()

Оскільки сортування _ є стабільним сортуванням, ви можете безпечно ланцюжок та зворотний сортування, тому що якщо два елементи мають однакове значення для властивості, їх порядок зберігається.

Більше інформації


Якщо у вас недостатньо представників для коментарів, не коментуйте. Хоча ви доклали це до фактичної відповіді, що добре, але вам навіть не потрібно згадувати цей факт.
ArtOfCode

Підкажіть, будь ласка, відповідь? stackoverflow.com/questions/62611489 / ...
reacg garav

13

Глибоке поле та багатопольовий та різний напрямок, замовляючи Лодаш> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);

Насправді це була б відповідь зараз. sortBy не дає тобі вказівки, але orderBy робить.
Пабло Паласіос

Підкажіть, будь ласка, відповідь? stackoverflow.com/questions/62611489 / ...
reacg garav

5

Чи є якийсь зручний спосіб визначення напрямку на стовпець?

Ні. Ви не можете вказати порядок сортування, окрім функції зворотного виклику, яка інвертує значення. Навіть це неможливо для багатоколінного сортування.

Ви можете зробити це

 _.each(array_of_objects, function(o) {
     o.typeDesc = -o.type; // assuming a number
 });
 _.sortBy(array_of_objects, ['typeDesc', 'name'])

Для всього іншого вам потрібно буде вдатися до рідного .sort()за допомогою спеціальної функції порівняння:

 array_of_objects.sort(function(a, b) {
     return a.type - b.type // asc
         || +(b.name>a.name)||-(a.name>b.name) // desc
         || …;
 });

3

У документації версії 4.11.x сказано: `" Цей метод схожий на _.sortBy, за винятком того, що він дозволяє вказувати порядки сортування ітераторів для сортування. Якщо замовлення не визначені, усі значення сортуються у порядку зростання. Інакше , вкажіть порядок "desc" для зменшення або "asc" для порядку порядку сортування відповідних значень. " (джерело https://lodash.com/docs/4.17.10#orderBy )

let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])


Я думаю, ти мав намір використовувати _.sortByOrder?
AJ Richardson

не вдається знайти змінну _
Vishal Vaghasiya

Підкажіть, будь ласка, відповідь? stackoverflow.com/questions/62611489 / ...
reacg garav

0

Ви також можете спробувати це:

var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));

Це буде набагато повільніше, ніж просто використання _.orderBy
reggaeguitar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.