2015-02-12 827 views
3

我有一个列表中的数字和字符串在那里。lodash sortby,如何排序数字比字母?

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

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

但是,无论是名称或编号可能会丢失。

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

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

这个排序与没有它的元素的前数的元素。我如何获得优先数字?

+0

您是否愿意使用原生JavaScript解决方案,还是想坚持使用lodash? – Eclecticist 2015-02-12 02:27:34

+0

我想出了一个使用.sort()函数的原生JS解决方案,但最终结果要比sortBy解决方案长得多。我现在可以保持这种方式,但如果有人有更好的主意,我也会很感激。 – 2015-02-12 02:37:07

+1

这里您的预期输出是什么?所有名称都按名称排序,后跟所有带数字的条目,按数字排序? – Retsam 2015-02-18 18:04:45

回答

1

我猜你的意思很简单_.sortBy排列在升序

sortBy_.sortBy(列表,iteratee,[上下文])返回(稳定地)排序的列表的拷贝 ,通过运行通过各iteratee值 的结果以升序排序。 iteratee也可以是要排序的属性(例如长度)的字符串名称。

http://underscorejs.org/#sortBy

因此,你优先element.name,看来最后的排序。

您可以简单地恢复所产生的阵列

results = results.reverse(); 

或者改变你的if/else语句的顺序。

0

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

我想你能破解这个,好像返回值:

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

这听起来像它可能会更容易分裂名单,零件分类,并把它重新走到一起,即:

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