使用Underscore sortBy - 按多个部分排序

时间:2015-03-06 10:41:51

标签: javascript sorting underscore.js

所以我试图按照优先级和位置对对象数组进行排序。

这是我尝试排序的数据示例:

widgetInfo = [
    {name: 'box1', position: 'mobile-top', priority: 'priority-1'}, 
    {name: 'box2', position: 'mobile-top', priority: false}, 
    {name: 'box3', position: 'mobile-top', priority: 'priority-2'}, 
    {name: 'box4', position: false, priority: false}, 
    {name: 'box5', position: 'mobile-bottom', priority: false}
];

我希望能够做的是让它们按顺序排列,以便首先使用{{1>} mobile-first 的对象,然后是{{1 } false ,最后是 mobile-bottom position的人。

然后是 mobile-top 的那些,我想按position的顺序排序,所以 mobile-top 优先级-1 显示在 mobile-top 上方, priority-2

所以数据会像:

position

我知道我可以使用下划线priority函数并按属性的字符串名称排序,但有没有办法用它来做我想要的事情?

我的问题与Underscore: sortBy() based on multiple attributes的不同之处在于我不是按照字母顺序或数字顺序排序,而是按特定顺序排序,以便 mobile-top 是第一个,然后是条目后跟 mobile-bottoms ,然后在这些条目中排序。

1 个答案:

答案 0 :(得分:2)

根据此回答https://stackoverflow.com/a/18262813/1071630以及http://blog.falafel.com/nifty-underscore-tricks-sorting-by-multiple-properties-with-underscore/中利用_.sortBy的稳定性给出的扩展,您可以链接sortBy,将枚举值转换为一个号码。像

这样的东西
var sorted = _.chain(widgetInfo)
.sortBy(function(box) {
   if (box.priority === false)
       return Number.POSITIVE_INFINITY;
   else
       return +box.priority.substr(9);
})
.sortBy(function(box) {
    switch(box.position) {
        case 'mobile-top' : return 0;
        case false : return 1;
        case 'mobile-bottom' : return 2;
        default: return 3;
    }
})
.value();

演示http://jsfiddle.net/nikoshr/yg37188n/