如果它们有重复,则对多维数组元素求和

时间:2018-04-15 06:20:26

标签: javascript arrays loops

我有一个这样的数组:

array = [[3, 'name'],[4, 'lastname'],[2, 'name'],[4, 'lastname']]

如果它们具有相同的第二个元素,我需要对这些值求和:

array = [[5, 'name'],[8, 'lastname']]

我尝试按字母顺序对数组进行排序,我知道不会有多个副本,然后如果item等于next,则将它们的值相加,否则什么都不做。也许这个条件应该是字符串化的,这只是为了展示我的尝试......

for(var n=0; n<finish.length; n++) {
    if(finish[n][1] === finish[n+1][1]) {
      finish[n][0] += finish[n+1][0];
    } else {
      finish[n][0] = finish[n][0];
    }
  }

循环返回此错误:Cannot read property '1' of undefined

3 个答案:

答案 0 :(得分:3)

您可以使用reduce将数据汇总到对象中。使用Object.values将对象转换为数组

&#13;
&#13;
let array = [[3, 'name'],[4, 'lastname'],[2, 'name'],[4, 'lastname']];

let result = Object.values(array.reduce((c, v) => {
  if (c[v[1]]) c[v[1]][0] += v[0];     //Add the first element if already exist
  else c[v[1]] = v;                    //Assign the value if does not exist
  return c;
}, {}));

console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您还可以使用Map来获得所需的输出:

let array = [[3, 'name'],[4, 'lastname'],[2, 'name'],[4, 'lastname']];

let map = ((m, a) => (array.forEach(c => {
   let [num, str] = c;
   m.set(str, (m.get(str) || 0) + num);
}), m))(new Map(), array);

let result = [...map.entries()].map(([a, b]) => [b, a]);

console.log(result);

答案 2 :(得分:0)

你上升到n&lt;长度,但您在

中引用了n + 1的索引

&#13;
&#13;
if(finish[n][1] === finish[n+1][1])
&#13;
&#13;
&#13;

因此,在这种情况下,一旦你到达n = 3,n + 1部分就会引用一个未定义的元素,从而引发错误。

要解决此问题,您需要达到(n <长度-1)