从一个对象数组中计算和存储不同的元素及其计数

时间:2014-10-09 18:01:20

标签: javascript arrays node.js

我有一个对象数组,我想计算不同元素的数量和这些对象的数量。

[ { name: 'Suman',
    game: '5A'
  },
  { name: 'Suman',
    game: '5A'
  },
  { name: 'Namus',
    game: '5A'
  },
  { name: 'Namus',
    game: '5A'
  }
]

我想计算不同名称的数量并将它们存储在一个对象中。我试过1#推送数组中的所有名称, 2#然后排序他们, 3#然后计算不同名称的数量和 4#终于将它们推向了物体。 这个过程太长了。有没有更短的方法来做到这一点。我正在使用Nodejs

提前致谢

2 个答案:

答案 0 :(得分:2)

您将创建一个新对象,其中键是名称,值是count:

var youArr = [ 
  { name: 'Suman',
    game: '5A'
  },
  { name: 'Suman',
    game: '5A'
  },
  { name: 'Namus',
    game: '5A'
  },
  { name: 'Namus',
    game: '5A'
  }
];

var count = {}
for(var i=0; i < youArr.length; i++){
    count[youArr[i].name] = count[youArr[i].name] || 0;
    count[youArr[i].name]++;
}

alert(count['Namus']); // 2

答案 1 :(得分:0)

这是使用reduce function的好地方:

  

reduce()方法对累加器和每个都应用一个函数   数组的值(从左到右)必须将其减少为单个   值。

     

...

     

reduce对每个元素执行一次回调函数   数组,不包括数组中的空洞,接收四个参数:   初始值(或前一次回调调用的值),值   当前元素,当前索引和数组   迭代正在发生。

它看起来像这样:

var arr = [ { name: 'Suman',
    game: '5A'
  },
  { name: 'Suman',
    game: '5A'
  },
  { name: 'Namus',
    game: '5A'
  },
  { name: 'Namus',
    game: '5A'
  }
]

var counts = arr.reduce(function(counts, item) {
    counts[item.name] = (counts[item.name] || 0) + 1;
    return counts;
}, {});
然后

counts

{ Suman: 2, Namus: 2 }

在评论中提问:

  

如果我想要计数以及对象数组中的名称,该怎么办?   [{name: 'Suman', count:'2'}, {name:'Namus', count:'2'}]

如果您已经从上面的counts来电中获得reduce,那么您可以map获得所需格式的密钥:

var countsArray = Object.keys(counts).map(function(name) {
    return {name: name, count: counts[name]};
});
然后

countsArray

[ { name: 'Suman', count: 2 },
  { name: 'Namus', count: 2 } ]