所以,基本上我得到一组记录作为对象数组,如
[{name: tyler, categories: ["friends", "neighbor"]}, {name: joe, categories: ["friends"]}].
我想计算内部数组实例的内容。所以在这个例子中,返回将是朋友:2和邻居:1。作为一些背景信息,我从流星框架中获取mongo的记录集合。然后我使用fetch()将这些记录转换为如上所述的对象数组。然后,我想使用这些对象根据外部数组中每个对象的内部数组(这些对象将是db查询返回的对象)中每个对象的特定实例的计数来创建饼图。
答案 0 :(得分:1)
您可以编写一个简单的函数来计算类别计数,并将结果存储在键/值对的字典中。
function countCategories(docs){
// accumulate results inside a JS object acting as a key/value dict
var result = {};
docs.forEach(function(doc){
doc.categories.forEach(function(category){
// initialize count to 0 when a new key is found
if(_.isUndefined(result[category])){
result[category] = 0;
}
// increment the corresponding count
result[category]++;
});
});
return result;
}
根据您问题中的示例数据,此函数将返回:
Object {friends: 2, neighbor: 1}
编辑:
然后,您可以将此字典转换为对象数组。
function convertToArray(dict){
var result = [];
_.each(dict, function(value, key){
var object = {
category: key,
count: value
};
result.push(object);
});
return result;
}
答案 1 :(得分:1)
使用下划线并减少:
result = _.reduce( data, function( counter, o ) {
_.each( o.categories, function(c){
counter[c] = 1 + _.result(counter, c, 0);
});
return counter;
}, {});
中的演示
reduce通过你的数组(第一个arg)并适用 你给它的功能(第二个arg)和一个起始值 备忘录(第三个arg)。此备忘录将传递给每次调用 你的函数作为第一个参数,你可以把它存储起来 你想要记住的东西。
我已将备忘录的起始值设置为空对象 我们将用作柜台。
result = _.reduce( data, function( counter, o ) {
// current element of the array: o
// stuff you want to remember for: counter
return counter;
}, {});
答案 2 :(得分:0)
您可以将函数附加到数组并计算其中的元素。
yourArray = [1,2,3];
yourArray.countElements = function(){
var elements=0;
for(x=0;this[x]!=undefined;x++){
instances++
}
return instances;
};
yourArray.countElements(); // outputs 3
修改此项,使用"邻居"和朋友"而不是"元素"只有在["类别"] [" the_category"]与未定义的不同时才计算它们。
您也可以将它附加到Array.prototype