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这样的操作一样简单吗?下划线是否比执行相同操作的本机数组函数具有优势?