2016-07-06 6 views
0

オブジェクトを含む配列を考えてみましょう。配列の各オブジェクトは、labelvalueの両方の属性で構成されています。私は配列の各オブジェクトを比較できるようにしたい、そしてラベルが同じであれば、ラベルが繰り返されないようにそれらの値を合計し、以前のすべての値の合計を持つ。アレイがこのだった場合JavaScript配列と合計属性を繰り返します。

等は、例えば、:最後に

[{ 
    label: "A", 
    value: 10 
    }, { 
    label: "B", 
    value: 20 
    }, { 
    label: "C", 
    value: 30 
    }, { 
    label: "C", 
    value: 40 
    }, { 
    label: "D", 
    value: 12 
    }, { 
    label: "D", 
    value: 23 
}] 

Iは、4つだけのラベル(A、B、C、D)およびAの値が10の配列を有するであろうBのための20、70は、CとD

のための35のために私は、forループを使用してみました:

for (i = 1; i < transformation.length; i++) { 
       if (transformation[i-1].label == transformation[i].label) { 
       result.label.push = transformation[i].label; 
       result.value.push = transformation[i-1].value + transformation[i].value; 

       } 
      }; 

しかし、私はここで立ち往生し、非繰り返される値に対処する方法には何のアイデアを持っていませんしまりました。 配列ではなくオブジェクトであるためには、最終配列が必要です。

答えて

3

これは、Array.reduceの完璧なケースです!

var sums = arr.reduce(function(results, item) { 
    if (!results.hasOwnProperty(item.label)) { 
     results[item.label] = 0; 
    } 

    results[item.label] += item.value; 
    return results; 
}, {}); 

console.log(sums); //Object {A: 10, B: 20, C: 70, D: 35} 
results

4つのキーA、B、C、D、それはアレイで発生した回数の合計を含む各を含むであろう。

+0

後続 'Object.entries(和).MAP(A =>({ラベルを使用することができます。 [0:value:a [1]})); '' {label: "X"、value:y} 'のようなオブジェクトを持つ配列を作成します。 – Xufox

+0

@tymeJV私は結果に '.map'関数を使うことができないので、これは完全には機能しません。私はそれを必要とします。配列を返す代わりにオブジェクトを返します。 –

+0

@Xufox私のコンソールは 'Object.entries'は関数ではないと言っています –

0

ちょうどArray.reduce @tymeJV同じ

が、ワンライナーとして

var sum = transformation.reduce(function(sumAll, item) { 
    sumAll[item.label] = item.value + sumAll[item.label] || 0; 
    return sumAll; 
}, {}) 

console.log(sum) // {"A":10,"B":20,"C":70,"D":35}