我有一个骨干集合,其中包含以下对象:
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
,但我没有看到返回多个值的方法。
答案 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);
答案 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