基于另一个数组的规则进行高级排序

时间:2014-03-02 12:16:24

标签: javascript arrays sorting

我试图搜索类似于我想要的东西,但我没有找到它,所以我在这里。

我将发布一个实际的例子,所以你们可以帮助我。

我正在使用带有BJJ腰带系统的Javascript构建此应用程序。所以我的数据类似于:

belts = [{
    color: 'white',
    stripes:2,
    date: '0000000000' // timestamp
},{
    color: 'blue',
    stripes:1,
    date: '0000000000' // timestamp
},{
    color: 'purple',
    stripes:0,
    date: '0000000000' // timestamp
},{
    color: 'purple',
    stripes:1,
    date: '0000000000' // timestamp
},{
    color: 'white',
    stripes:3,
    date: '0000000000' // timestamp
},{
    color: 'white',
    stripes:4,
    date: '0000000000' // timestamp
},{
    color: 'brown',
    stripes:1,
    date: '0000000000' // timestamp
},{
    color: 'black',
    stripes:0,
    date: '0000000000' // timestamp
}];

所以现在我想用腰带和条纹对它进行排序。

所以我想创建一个规则,其中包含需要排序的皮带顺序。

类似的东西:

belt_rules = ['white','blue','purple','brown', 'black'];

当我运行排序时,我将拥有之前未排序的数组,按照上述规则及其上升条纹的顺序显示。

我不清楚我将如何做到这一点。任何接受挑战的人都可以帮助我吗?

由于

2 个答案:

答案 0 :(得分:3)

belts.sort(function(a, b) {
    var acolor = belt_rules.indexOf(a.color);
    var bcolor = belt_rules.indexOf(b.color);
    var color_diff = acolor - bcolor;
    return color_diff || a.stripes - b.stripes;
});

答案 1 :(得分:0)

var ordering = {}, // map for efficient lookup of sortIndex
    sortOrder = ['fruit','candy','vegetable'];
for (var i=0; i<belt_rules.length; i++)
    ordering[belt_rules[i]] = i;

belts.sort( function(a, b) {
    return (ordering[a.type] - ordering[b.type]) || a.stripes - b.stripes;
});