2017-01-16 2 views
1

У меня есть приложение, в котором мне нужно подсчитать свои двери. Например:Node.js подсчет моих объектов объекта массива

  • door1 имеет 60 человек
  • door2 имеет 70 человек

Но как я могу получить сумму каждой двери, потому что. Я хочу нажимать сумму каждой двери на мой db, эти данные я получаю от своего клиента каждую минуту, затем я подталкиваю результаты к своему db, и я очищаю массив для следующего набора объектов.

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

ответ

0

и теперь просто console.log (результат)

Или вы даже можете улучшить код, используя некоторый синтаксический сахар:

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

спасибо, но зачем вам нужно || 0? – nodeMan

0
values=[1,2].map(door=>a.filter(d=>d.door==door).reduce((val,d)=>val+d.people,0)); 

значение будет [60,70], Для каждой двери (1 и 2), получить весь elems от а, где дверь elems есть дверь, а затем присоединиться к этим elems ценности людей и отобразить его назад к массиву. Поэтому каждая дверь заменяется ссылочной стоимостью.

Если вы не знаете, двери, можно создать ассоциативный объект:

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

это приведет:

{ 
1:60, 
2:70 
} 
1

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);

2

это отличный пример когда вы можете использовать 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, это можно записать еще succintly как:

let total = a.map(o => o.people).reduce((a,b) => a + b); 
0
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 
}); 
} 
}); 
0

Я не знаю желаемого формата результата, но если объект хорош и с учетом того, что вы заранее не знаете о своих дверях, достаточно всего лишь 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)

Код выше проще понять, но немного многословным. Обратный вызов reduce() может быть сокращенно следующим образом:

a.reduce((accumulator, currentValue) => { 
    accumulator[currentValue.door] = accumulator[currentValue.door] || 0; 
    accumulator[currentValue.door] += currentValue.people; 
    return accumulator; 
}, {}); 
Смежные вопросы