所以我试图按照优先级和位置对对象数组进行排序。
这是我尝试排序的数据示例:
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 ,然后在这些条目中排序。
答案 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();