对 JavaScript 数组重复值求和

Sum javascript arrays repeated value

本文关键字:求和 JavaScript 数组      更新时间:2023-09-26

我正在尝试对重复的javascript数组值求和,我希望每个键在此总和之后都有一个值。

下面是 javascript 数组示例:

var myArray = [ {'TR-01':1}, {'TR-02':3}, {'TR-01':3}, {'TR-02':5}];

所需的格式化数组应如下所示:

var newArray = [ {'TR-01':4}, {'TR-02':8}];

我们如何在javascript中做到这一点?

当你这样做时

var obj = {
    'TR-01':1,
    'TR-02':3, 
    'TR-01':3,
    'TR-02':5 
};

如果现在执行alert(obj["TR-01"]);,则可以看到输出3

或者一个console.log(obj),输出为:{TR-01: 3, TR-02: 5}。您不知道以前的值。

你基本上覆盖了它们。我会说你不能这样做。至少不是你想象的那样。

更新

var myArray = [ 
    {'TR-01':1}, 
    {'TR-02':3}, 
    {'TR-01':3}, 
    {'TR-02':5} 
];
var newArray = [];
var newObj = {};
for(var i = 0; i < myArray.length; i++) {
  for(var prop in myArray[i]) {
      if(!newObj.hasOwnProperty(prop)) {
          newObj[prop] = 0;
      }
      newObj[prop] += myArray[i][prop];
  }
}
for(var prop in newObj) {
    var obj = {};
    obj[prop] = newObj[prop];
    newArray.push(obj);
}
console.log(newObj);    // OUTPUT: {TR-01: 4, TR-02: 8}
console.log(newArray);  // OUTPUT: [ { TR-01: 4 }, { TR-02: 8 } ]

我相信有更简单的方法,我也只是在学习JS。 :)

具有

Array.map()Object.keys()的灵活解决方案:

var myArray = [ 
            {'TR-01':1},
            {'TR-02':3}, 
            {'TR-01':3},
            {'TR-02':5} 
    ];
    var summedArray = [], props = {}, prop;
    myArray.map(function(obj){
        var prop = Object.keys(obj)[0]; // get single object property name
        props[prop] = (Object.keys(props).indexOf(prop) !== -1)?  (props[prop] + obj[prop]) : obj[prop];
    });
    for (prop in props) {
        var newObj = {};
        newObj[prop] = props[prop];
        summedArray.push(newObj); // adding object to final array
    }
    console.log(summedArray); // [{'TR-01':4}, {'TR-02':8}]

您可以使用临时对象,其中对象用于引用,数组用于结果:

var myArray = [{ 'TR-01': 1 }, { 'TR-02': 3 }, { 'TR-01': 3 }, { 'TR-02': 5 }],
    result = myArray.reduce(function (r, a) {
        Object.keys(a).forEach(function (k) {
            var o = {};
            if (!(k in r.obj)) {
                o[k] = 0;
                r.obj[k] = o;
                r.array.push(o);
            }
            r.obj[k][k] += a[k];
        });
        return r;
    }, { array: [], obj: {} }).array;
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');