2017-01-16 8 views
1

私は自分のドアを数える必要があるアプリケーションを持っています。たとえば:Node.js配列オブジェクトのアイテム数をカウントする

  • door1は60人
  • door2は70人

を持っている。しかし、どのように私はので、各ドアの合計を取得することができます。私は各ドアの合計をデータベースにプッシュしたいと思います。毎分クライアントから取得したこのデータをデータベースにプッシュし、次のオブジェクトの配列をクリアします。

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に参加する人々はそれを価値とマップアレイに戻ります。したがって、すべてのドアはその参照値に置き換えられます。

あなたがドアを知らない場合、あなたが連想オブジェクトを作成できます。この素晴らしい例

{ 
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

:これはになります

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

map()とを使用できるときのともに:

Array.prototype.map()は、配列の各項目に対して関数を実行し、各項目を別のものに変換します(同じ長さの新しい配列を返します)。

Array.prototype.reduce()は、配列内の各値に基づいて1つの値を累積的に計算します(ただ1つの値を返します)。我々は最初だけで、その「人」の値に配列内の各オブジェクトを変換するためにmap()を使用して上記の例では

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

[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; 
}, {}); 
関連する問題