骨干集合groupby数组属性

时间:2014-04-28 11:44:32

标签: javascript backbone.js

我有一个骨干集合,其中包含以下对象:

users = {
    'name': 'Johan',
    'groups': [1234, 5678]
}, {
    'name': 'Thomas',
    'groups': [1234]
}, {
    'name': 'Adam',
    'groups': [1234, 5678, 7890]
};

我想计算"groups"并将其保存在以下地图中:

countArray = [1234 : 3 , 5678 : 2, 7890: 1];

所以我可以访问;

countArray[1234] -> return 3;

countArray.get('1234') -> return 3;

无论如何

通过这种方式,我可以_.each我的其他收藏集"classes"并查找每个班级中的用户数量。

我在考虑使用函数式编程并以某种方式使用_.groupBy,但我没有看到返回多个值的方法。

2 个答案:

答案 0 :(得分:2)

_.groupBy将允许您聚合给定键或函数返回的值上的对象,您将无法在同一遍中对多个对象进行分类。

你可以两个_.each来构建一个映射对象:

var c = new Backbone.Collection(users);

var res = {};
c.each(function(m) {
    _.each(m.get('groups'), function(g) {
        res[g] = res[g] || 0;
        res[g]++;
    });
});

console.log(res);

请参阅http://jsfiddle.net/nikoshr/V2qX2/1/了解演示

答案 1 :(得分:0)

假设users是这样的正确数组:

users = [{
    'name': 'Johan',
    'groups': [1234, 5678]
}, {
    'name': 'Thomas',
    'groups': [1234]
}, {
    'name': 'Adam',
    'groups': [1234, 5678, 7890]
}];

然后这将起作用:

var output = {};

for(var i = 0; i < users.length; i++){
    for(var j = 0; j < users[i].groups.length; j++){
        output[users[i].groups[j]] = (output[users[i].groups[j]] ? output[users[i].groups[j]] + 1 : 1)
    }
}

console.log(output);
// Object {1234: 3, 5678: 2, 7890: 1}
console.log(output[1234]);
// 3

或者可能更具可读性:

for(var i = 0; i < users.length; i++){
    for(var j = 0; j < users[i].groups.length; j++){
        var group = users[i].groups[j];
        output[group] = output[group] || 0; // If the current group hasn't been added yet, default value.
        output[group]++;
    }
}

不使用下划线/主干库这样简单的优点是本机JS比那些库significantly faster