对多维数组中的数值求和

sum numeric values in a multidimentional array

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

我在Javascript中有一个这样的数组:

var scores = [
    {"firstName":"John", "value": 89},
    {"firstName":"Peter", "value": 151},
    {"firstName":"Anna", "value": 200},
    {"firstName":"Peter", "value": 22},
    {"firstName":"Anna","value": 60}
];

我想转换这个数组,以便组合相似的名字的值。我期望的结果是:

var scores = [
    {"firstName":"John", "value": 89},
    {"firstName":"Peter", "value": 173},
    {"firstName":"Anna", "value": 260}
];

认为,

Just:

var scores = [{
  "firstName": "John",
  "value": 89
}, {
  "firstName": "Peter",
  "value": 151
}, {
  "firstName": "Anna",
  "value": 200
}, {
  "firstName": "Peter",
  "value": 22
}, {
  "firstName": "Anna",
  "value": 60
}];
var names = {};
var new_arr = [];
scores.forEach(function(entry) {
  if (names.hasOwnProperty(entry.firstName)) {
    new_arr[names[entry.firstName]].value += entry.value;
  } else {
    names[entry.firstName] = new_arr.length;
    new_arr.push({
      "firstName": entry.firstName,
      "value": entry.value
    });
  }
});
console.log(new_arr);

这是一个两步解决方案。首先数一下所有的项目。其次,将结果格式化为所需的样式。

var scores = [
    { "firstName": "John", "value": 89 },
    { "firstName": "Peter", "value": 151 },
    { "firstName": "Anna", "value": 200 },
    { "firstName": "Peter", "value": 22 },
    { "firstName": "Anna", "value": 60 }
];
var result = [],
    r0 = scores.reduce(function (r, a) {
        r[a.firstName] = (r[a.firstName] || 0) + a.value;
        return r;
    }, {}), // { "John": 89, "Peter": 173, "Anna": 260 }
    i;
for (i in r0) {
    result.push({ firstName: i, value: r0[i] });
}
document.getElementById('out').innerHTML = JSON.stringify(result, null, 4);
<pre id="out"></pre>

var result = [],
    names = [],
    index;
var scores = [
   {"firstName":"John", "value": 89},
   {"firstName":"Peter", "value": 151},
   {"firstName":"Anna", "value": 200},
   {"firstName":"Peter", "value": 22},
   {"firstName":"Anna","value": 60}
];
scores.forEach(function (score) {
  index = names.indexOf(score.firstName);
  if (index === -1) {
     index = names.push(score.firstName) - 1;
     result.push({firstName: score.firstName, value: 0});
  }
  result[index].value += score.value;
});
console.log(result);