Node.js计数我的数组对象项目

我有一个应用程序,我需要数我的门。 例如:

  • door1有60个人
  • 门2有70人

但是,我怎样才能得到每个门的总和,因为。 我想把每个门的总和推到我的数据库,我每分钟从客户端获得的这些数据,然后将结果推送到我的数据库,并清除下一组对象的数组。

var a = [ {door: 1 , people: 20}, {door: 2 , people: 20}, {door: 1 , people: 10}, {door: 1 , people: 20}, {door: 2 , people: 50}, ] 

 var result = {} a.map(i => result[i.door] = (result[i.door] || 0) + i.people) 

现在只是console.log(结果)

或者你甚至可以用这样的语法糖来增强代码:

 var result = {} a.map({door, people} => result[i.door] = (result[door] || 0) + people) 

这是一个很好的例子,你可以一起使用map()和reduce() :

Array.prototype.map()将在数组中的每个项目上运行一个函数,并将每个项目转换成其他东西(返回一个长度相同的新数组)。

Array.prototype.reduce()将根据数组中的每个值累计计算单个值(仅返回一个值)。

 var total = a.map(function(e) { return e.people }) .reduce(function(a, b) { return {a + b}; }) 

在上面的例子中,我们首先使用map()将数组中的每个对象转换为其“人员”值。 所以在这一步之后,我们有一个如下的数组:

 [20, 20, 10, 20, 50] 

然后我们在该数组上调用reduce() ,累积地将这些数字相加。

在ES6中,这可以写得更加简洁:

 let total = a.map(o => o.people).reduce((a,b) => a + b); 
 var a = [ {door: 1 , people: 20}, {door: 2 , people: 20}, {door: 1 , people: 10}, {door: 1 , people: 20}, {door: 2 , people: 50}, ]; var sum = {}; for(var i=0;i<a.length;i++){ sum[a[i].door] = sum[a[i].door] || 0; sum[a[i].door] += a[i].people; } console.log(sum); 
 values=[1,2].map(door=>a.filter(d=>d.door==door).reduce((val,d)=>val+d.people,0)); 

值将会是[60,70],对于每一个门(1和2),获得一个门的所有元素,然后将这些元素join到这些元素中,并将其映射回数组。 所以每一扇门都被它的引用价值取代。

如果你不知道门,你可以创build一个关联对象:

  values=a.reduce((all,elem)=>{ return all[elem[door]]=all[elem.door]||0,all[elem.door]+=elem.people;},{}); 

这将导致:

 { 1:60, 2:70 } 
 var array = [ {door: 1 , people: 20}, {door: 2 , people: 20}, {door: 1 , people: 10}, {door: 1 , people: 20}, {door: 2 , people: 50}, ] var res = []; array.forEach(function(element) { var e = res.find(function(data) { return data.door == element.door; }); if(e) { element.people = e.people + element.people; } else { res.push({ door: element.door, people: element.people }); } }); 

我不知道你想要的结果格式,但如果一个对象是好的,考虑到你事先不知道你的门,只用reduce()就足够了。

 var a = [ {door: 1 , people: 20}, {door: 2 , people: 20}, {door: 1 , people: 10}, {door: 1 , people: 20}, {door: 2 , people: 50}, ] var result = a.reduce((accumulator, currentValue) => { if (!accumulator[currentValue.door]) { // set property the first time you find a door accumulator[currentValue.door] = 0; } // sum the number of people each door in each iteration accumulator[currentValue.door] += currentValue.people; return accumulator; }, {}); console.log(result)