您如何计算数组中数组中对象的实例

时间:2015-05-25 15:52:52

标签: javascript mongodb d3.js meteor

所以,基本上我得到一组记录作为对象数组,如

[{name: tyler, categories: ["friends", "neighbor"]}, {name: joe, categories: ["friends"]}]. 

我想计算内部数组实例的内容。所以在这个例子中,返回将是朋友:2和邻居:1。作为一些背景信息,我从流星框架中获取mongo的记录集合。然后我使用fetch()将这些记录转换为如上所述的对象数组。然后,我想使用这些对象根据外部数组中每个对象的内部数组(这些对象将是db查询返回的对象)中每个对象的特定实例的计数来创建饼图。

3 个答案:

答案 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;
}, {});

this fiddle

中的演示

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