lodash sortby,如何在字母之后对数字进行排序?

时间:2015-02-12 02:09:42

标签: javascript underscore.js lodash

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

列表中的每个元素都类似于:

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

但是,名字或号码可能都会丢失。

在我的排序中,我做了类似的事情:

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

在没有它的情况下,元素前面的元素排序。我如何获得lodash去优先考虑数字?

3 个答案:

答案 0 :(得分:1)

我猜你的意思就是_.sortBy按升序排名?

  

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

http://underscorejs.org/#sortBy

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

您可以简单地反转生成的数组

results = results.reverse();

或者,更改if/else声明的顺序。

答案 1 :(得分:1)

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

我猜你可以破解这个,返回一个像:

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

答案 2 :(得分:1)

听起来可能更容易拆分清单,对零件进行分类并将其重新组合在一起,即:

 _(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