如何使用underscoreJS根据某个属性值对集合进行排序?

时间:2014-03-18 16:37:24

标签: sorting collections underscore.js

我有一个对象集合,我希望能够对所有具有特定属性值的对象进行排序,因为' false'应该出现在其他人面前。这是集合的结构

[Object, Object, Object, Object]
0: Object
attribute1: some value
attribute2: some value
attribute3: some value
attribute4: false

我希望属性4值为false的所有对象出现在attribute4值为true的对象之前。这怎么能用下划线来表达呢?

2 个答案:

答案 0 :(得分:1)

attribute4转换为数字并按此排序......

var sorted = _(unsorted).sortBy(function(x) { return x.attribute4 === false ? 0 : 1; });

答案 1 :(得分:0)

如果您只是想根据attribute4将数组分成两部分,那么您实际上并没有进行排序,而是进行分区。如果是这样,那么您可以使用_.partition拉开阵列并_.flatten将部件重新组合在一起:

var a = [
    { p1:  6, p2: false },
    { p1: 11, p2: true  },
    { p1: 23, p2: true  },
    { p1: 42, p2: false }
];
var b = _(a).chain()
            .partition(function(o) { return !o.p2 })
            .flatten()
            .value();

演示:http://jsfiddle.net/ambiguous/EWd35/

如果你真的在排序,那么你几乎肯定想要一个辅助排序键然后你应该使用Array.prototype.sort而不是Underscore的sortBy(它根本不能处理多键排序)孔):

var b = a.sort(function(a, b) {
    if(a.p2 == b.p2)
        return a.p1 - b.p1;
    if(a.p2)
        return 1;
    return -1;
});

演示:http://jsfiddle.net/ambiguous/kLMeB/