lodash多列sortBy降序

nha*_*123 139 javascript sorting lodash

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

var data = _.sortBy(array_of_objects, ['type', 'name']);
Run Code Online (Sandbox Code Playgroud)

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

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

djs*_*ner 290

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

var data = _.sortByOrder(array_of_objects, ['type','name'], [true, false]);
Run Code Online (Sandbox Code Playgroud)

版本3.10.0开始,您甚至可以使用标准语义进行排序(asc,desc):

var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);
Run Code Online (Sandbox Code Playgroud)

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

var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);
Run Code Online (Sandbox Code Playgroud)

  • 为什么lodash会保留重命名功能? (54认同)
  • 使用lodash@4.17.10对我,`,['asc','desc']部分进行了忽略.一切都只是按升序排序. (10认同)
  • 对于您的信息,自4.5.0起,此功能已在Lodash中重命名为_.orderBy(https://lodash.com/docs#orderBy).正常排序函数称为_.sortBy(https://lodash.com/docs#sortBy) (7认同)
  • 我在最新版本的 lodash 中得到了 `_.sortByOrder is not a function`。 (2认同)
  • @maninak这是针对_.sortBy的。试试`_.orderBy`。希望这可以帮助。 (2认同)

小智 41

你可以随时使用 Array.prototype.reverse()

var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();
Run Code Online (Sandbox Code Playgroud)

  • 虽然对某些情况足够好,但这样做的结果是对BOTH列进行降序排序,这不是问题所要求的. (2认同)

cut*_*ish 14

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

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

var data = _(data).chain()
    .sort("date")
    .reverse()    // sort by date descending
    .sort("name") // sort by name ascending
    .result()
Run Code Online (Sandbox Code Playgroud)

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

更多信息


小智 10

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

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);
Run Code Online (Sandbox Code Playgroud)


Ale*_*lva 6

在 4.11.x 版本的文档中,说:`“这个方法类似于 _.sortBy,除了它允许指定要排序的迭代器的排序顺序。如果未指定顺序,则所有值都按升序排序。否则, 指定“desc”的降序顺序或“asc”的相应值的升序排序顺序。” (来源https://lodash.com/docs/4.17.10#orderBy

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


Ber*_*rgi 5

是否有一些方便的方法来定义每列的方向?

不可以.除了通过反转值的回调函数之外,您不能指定排序顺序.对于多列排序,这甚至都不可能.

你可能会这样做

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

对于其他所有内容,您需要.sort()使用自定义比较函数求助于本机:

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