Lodash multi-column sortBy по убыванию

Существует отличный метод для сортировки массива объектов на основе нескольких свойств:

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

Однако это только для восходящей сортировки. Есть ли удобный способ определения направления для столбца? Например.

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

Ответ 1

В lodash 3.5.0 вы можете использовать sortByOrder (переименованный orderBy в версии 4.0.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']);

Ответ 2

Вы всегда можете использовать Array.prototype.reverse()

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

Ответ 3

Стоит отметить, что если вы хотите отсортировать определенные свойства по убыванию, вы не хотите просто добавлять .reverse() в конец, так как это приведет к уменьшению всех видов.

Чтобы сделать определенные сортировки по убыванию, соберите свои виды от наименее значимых до наиболее значимых, вызывая .reverse() после каждого вида, который вы хотите спускать.

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

Поскольку _ sort - это стабильный вид, вы можете безопасно группировать и сортировать сортировки, потому что, если два элемента имеют одинаковое значение для свойства, их порядок сохраняется.

Дополнительная информация

Ответ 4

Есть ли удобный способ определения направления на столбе?

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

Возможно, вы сможете сделать

 _.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
         || …;
 });

Ответ 5

Заказы на глубокое поле и многополюсное и другое направление Lodash > 4

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

Ответ 6

В документации по версии 4.11.x говорится: ` "Этот метод похож на _.sortBy, за исключением того, что он позволяет указать порядок сортировки итераций для сортировки. Если заказы неуказаны, все значения сортируются в порядке возрастания. В противном случае укажите порядок" desc "для нисходящего или" asc "" для возрастающего порядка сортировки соответствующих значений". (источник https://lodash.com/docs#sortBy)

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

Ответ 7

Вы также можете попробовать следующее:

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