Javascript 如何计算数组中数组中对象的实例数
因此,本质上我得到了一组记录,作为一个对象数组,比如Javascript 如何计算数组中数组中对象的实例数,javascript,mongodb,d3.js,meteor,Javascript,Mongodb,D3.js,Meteor,因此,本质上我得到了一组记录,作为一个对象数组,比如 [{name: tyler, categories: ["friends", "neighbor"]}, {name: joe, categories: ["friends"]}]. 我想计算内部数组实例的内容。所以在这个例子中,返回的是friends:2和neighbor:1。作为一些背景信息,我在meteor框架内从mongo收集了一些记录。然后,我使用fetch()将这些记录转换为如上所述的对象数组。然后,我想使用这些对象根据外部数
[{name: tyler, categories: ["friends", "neighbor"]}, {name: joe, categories: ["friends"]}].
我想计算内部数组实例的内容。所以在这个例子中,返回的是friends:2和neighbor:1。作为一些背景信息,我在meteor框架内从mongo收集了一些记录。然后,我使用fetch()将这些记录转换为如上所述的对象数组。然后,我想使用这些对象根据外部数组中每个对象的内部数组(这些对象将是db查询返回的对象)中每个对象的特定实例的计数创建一个饼图 您可以将一个函数附加到数组中,并对其中的元素进行计数
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您可以编写一个简单的函数来计算类别计数,并将结果存储在键/值对字典中
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;
}
使用下划线和reduce:
result = _.reduce( data, function( counter, o ) {
_.each( o.categories, function(c){
counter[c] = 1 + _.result(counter, c, 0);
});
return counter;
}, {});
演示
reduce遍历数组(第一个参数)并应用
你给它的函数(第二个参数)和一个起始值
备忘录(第三个参数)。此备忘录将传递给每个呼叫
你的函数作为第一个参数,你可以把它存储起来
你想记住的东西
我已将备忘录的起始值设置为空对象
我们将把它用作计数器
result = _.reduce( data, function( counter, o ) {
// current element of the array: o
// stuff you want to remember for: counter
return counter;
}, {});
你可以和汇总功能一起使用。你能解释一下汇总功能吗?谢谢请更正您的数据声明,在字符串项周围加引号。有一个示例几乎完全符合您的要求(从文档链接)。太好了,这看起来不错。返回像[{friends:2},{neighbor:1}]这样的对象数组会很困难吗?这非常有效!如果你不介意的话,再问一个问题。取而代之的是使用count和category name属性获取对象,而不是使用category作为键获取对象。如[{类别:“朋友”,计数:3},{类别:“邻居”,计数:5}]。再次感谢你的帮助!它会像在u.each函数调用中执行object.categoryName=key和object.Count=value这样的操作一样简单吗?下划线是否比执行相同操作的本机数组函数具有优势?