Javascript 主干集合groupby数组属性

Javascript 主干集合groupby数组属性,javascript,backbone.js,Javascript,Backbone.js,我有一个主干集合,其中包含以下对象: users = { 'name': 'Johan', 'groups': [1234, 5678] }, { 'name': 'Thomas', 'groups': [1234] }, { 'name': 'Adam', 'groups': [1234, 5678, 7890] }; 我想计算“组”,并将其保存在地图中,如: countArray = [1234 : 3 , 5678 : 2, 7890: 1

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

users = {
    'name': 'Johan',
    'groups': [1234, 5678]
}, {
    'name': 'Thomas',
    'groups': [1234]
}, {
    'name': 'Adam',
    'groups': [1234, 5678, 7890]
};
我想计算
“组”
,并将其保存在地图中,如:

countArray = [1234 : 3 , 5678 : 2, 7890: 1];
这样我就可以访问

countArray[1234] -> return 3;

无论如何

这样,我就可以
\每个
我的另一个收藏
“类”
并查找每个类中的用户数


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

假设
用户
是这样一个合适的数组:

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
var输出={};
对于(var i=0;i
或者更具可读性:

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]++;
    }
}
for(var i=0;i
对于如此简单的事情,不使用下划线/主干库的优点是,本机JS比那些库更容易聚合给定键或函数返回的值上的对象,因此无法在同一过程中对多个对象进行分类

您可以使用两个
\来构建映射对象,每个

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);

请看演示

@Johan,我可以问一下是什么让你选择了这个答案吗?
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);