【问题标题】:lodash sortby, how to sort numbers later than letters?lodash sortby,如何对比字母晚的数字进行排序?
【发布时间】:2015-02-12 02:09:42
【问题描述】:

我有一个包含数字和字符串的列表。

列表的每个元素看起来像:

{
  'name': 'Bob',
  'number': 234234
}

但是,可能缺少姓名或号码。

在我的 sortBy 中,我做了这样的事情:

_.sortBy(list, function(element) {
  if (element.name) {
    return element.name;
  }
  else {
    return element.number;
  }
});

这对没有数字的元素进行排序。如何让 lodash 降低数字的优先级?

【问题讨论】:

  • 您愿意使用原生 JavaScript 解决方案,还是坚持使用 lodash?
  • 我想出了一个使用 .sort() 函数的原生 JS 解决方案,但它最终比 sortBy 解决方案要长得多。我现在可以保持这种方式,但如果有人有更好的想法,我也会很感激。
  • 您的预期输出是什么?所有带名称的整体,按名称排序,后跟所有带数字的条目,按数字排序?

标签: javascript underscore.js lodash


【解决方案1】:

我猜你的意思只是 _.sortBy 按升序排列?

sortBy_.sortBy(list, iteratee, [context]) 返回一个(稳定)排序的 列表的副本,按每个运行的结果升序排列 通过迭代的值。 iteratee 也可以是字符串名称 要排序的属性(例如长度)。

http://underscorejs.org/#sortBy

因此,当您优先考虑 element.name 时,它在排序中显示在最后。

你可以简单地反转结果数组

results = results.reverse();

或者,更改if/else 语句的顺序。

【讨论】:

    【解决方案2】:

    _.sortBy 正在使用返回值创建具有criteria 属性的对象。 criteria 属性是与array.sort 函数和ad hoc 比较的值,不可配置comparer 函数。

    我猜你可以破解这个,返回如下值:

        _.sortBy(list, function(element) {
          if (element.name) {
            return "@" + element.name;
          }
          else {
            return element.number;
          }
        };
    

    【讨论】:

      【解决方案3】:

      听起来可能更容易拆分列表,对部分进行排序并将其重新组合在一起,即:

       _(data) //begin chain
          .filter("name") //the entries with names
          .sortBy("name") //sorted by name
          .concat(_.sortBy(_.reject(data, "name"), "number")) //followed by the entries without name, sorted by number
          .value(); //end chain
      

      【讨论】:

        猜你喜欢
        • 2021-08-21
        • 1970-01-01
        • 2021-10-13
        • 1970-01-01
        • 2011-02-06
        • 2017-05-11
        • 2021-09-19
        • 1970-01-01
        相关资源
        最近更新 更多