lodash多列sortBy降序

时间:2014-04-08 06:07:54

标签: javascript sorting lodash

有一种漂亮的方法可以根据几个属性对对象数组进行排序:

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

然而,这仅适用于升序排序。是否有一些方便的方法来定义每列的方向? E.g。

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

7 个答案:

答案 0 :(得分:262)

lodash 3.5.0 开始,您可以使用sortByOrder(在v4.3.0中重命名为orderBy):

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']);

在lodash的版本4 中,此方法已重命名为orderBy

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

答案 1 :(得分:37)

您始终可以使用Array.prototype.reverse()

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

答案 2 :(得分:14)

值得注意的是,如果你想对降序的特定属性进行排序,你不想简单地在末尾附加.reverse(),因为这将使所有排序降序。

要使特定排序降序,请将排序从最不重要到最重要排序,在每个要降序的排序后调用.reverse()。

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

由于_的排序是稳定的排序,因此您可以安全地进行排序和反向排序,因为如果两个项目具有相同的属性值,则会保留其顺序。

More information

答案 3 :(得分:8)

深场&多场&不同的方向订购 Lodash> 4

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

答案 4 :(得分: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
         || …;
 });

答案 5 :(得分:2)

在版本4.11.x的文档中说:` “此方法与_.sortBy类似,不同之处在于它允许指定迭代的排序顺序以进行排序。如果未指定订单,则所有值都按升序排序。否则,指定降序的”desc“顺序或”asc“ “对于相应值的升序排序。” (来源https://lodash.com/docs/4.17.10#orderBy

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

答案 6 :(得分:0)

你也可以试试这个:

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