lodash多列排序按降序


151

有一个很不错的方法可以根据几个属性对对象数组进行排序:

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

但是,这仅用于升序排序。有一些方便的方法来定义每列的方向吗?例如

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

Answers:


329

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

7
为您提供信息,此功能已从4.3.0开始在Lodash中重命名为_.orderBy(lodash.com/docs#orderBy)。正常的排序功能称为_.sortBy(lodash.com/docs#sortBy
Nidhin David

2
我正在获取_.sortByOrder is not a function最新版本的lodash。
chovy

66
为什么lodash保留重命名功能?
肯尼·沃登

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 2016年

3
虽然在某些情况下足够好,但这样做的效果是对BOTH列的降序排序,这不是问题要问的。
Inkling


14

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

要使特定的排序降序,请将您的排序从最低有效到最高有效进行链接,在每个要降序的排序之后调用.reverse()。

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

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

更多信息


如果您没有足够的代表发表评论,请不要发表评论。尽管您已将其充实为实际答案,这很好,但是您甚至无需提及该事实。
ArtOfCode 2015年



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理查森

找不到变量_
Vishal Vaghasiya


0

您也可以尝试以下操作:

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

这将比仅使用_.orderBy慢得多
reggaeguitar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.