【问题标题】:lodash multi-column sortBylodash 多列排序
【发布时间】:2014-05-20 15:58:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript sorting lodash


    【解决方案1】:

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

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

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

    【讨论】:

    • 供您参考,自 4.3.0 起,此函数已在 Lodash 中重命名为 _.orderBy(lodash.com/docs#orderBy)。正常的排序函数称为_.sortBy(lodash.com/docs#sortBy)
    • 我在最新版本的 lodash 中收到 _.sortByOrder is not a function
    • 为什么 lodash 一直在重命名函数?
    • , ['asc', 'desc'] 部分被 lodash@4.17.10 忽略了。一切都只是升序排序。
    • @maninak 这是给_.sortBy的。请改用_.orderBy。希望这会有所帮助。
    【解决方案2】:

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

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

    【讨论】:

    • 哈哈,这很聪明。对于数字升序排序(lodash 默认降序)我使用了这个:_.sortBy(array_of_objects, "some_numerical_value_key").reverse()
    • 虽然在某些情况下已经足够好了,但这样做的效果是对两列都进行降序排序,这不是问题所要问的。
    【解决方案3】:

    深场&多场&不同方向排序 罗达什 >4

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

    【讨论】:

    • 其实这就是现在的答案。 sortBy 不会给你方向,但 orderBy 可以。
    【解决方案4】:

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

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

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

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

    More information

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 我想你的意思是使用_.sortByOrder
      • 找不到变量_
      【解决方案6】:

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

      没有。除了通过反转值的回调函数之外,您无法指定排序顺序。对于多列排序,这甚至是不可能的。

      你也许可以做到

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

      【讨论】:

        【解决方案7】:

        你也可以试试这个:

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

        【讨论】:

        • 这将比仅使用 _.orderBy 慢得多
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多