2016-07-06 67 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 
}] 

最后,我将有只有四个标签(A,B,C,d),值10 A中的阵列, 20 B,70 C和35 D.

我试图用一个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}