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

Using Underscore sortBy - Sorting by multiple parts

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

这是我要排序的数据示例:

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}
];

我想要做的是让它们按顺序排列,这样 positionmobile-first 的对象排在第一位,然后是那些positionfalse 最后是 positionmobile-bottom.

然后在具有 mobile-top 的那些中,我想按 priority 的顺序对它们进行排序,因此 mobile-top priority-1 出现在 mobile-top 上方,priority-2.

所以数据会像这样:

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

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

我的问题与 Underscore: sortBy() based on multiple attributes 不同,因为我不是按字母顺序或数字顺序排序,而是按特定顺序排序,因此 mobile-top 是第一个,其次是通过 false 条目,然后是 mobile-bottoms,然后在其中排序。

基于这个答案 and on the expansion given in http://blog.falafel.com/nifty-underscore-tricks-sorting-by-multiple-properties-with-underscore/ taking advantage of the stability of _.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/