我有一个这样的数组:
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
答案 0 :(得分:3)
您可以使用reduce
将数据汇总到对象中。使用Object.values
将对象转换为数组
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;
答案 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的索引
if(finish[n][1] === finish[n+1][1])
&#13;
因此,在这种情况下,一旦你到达n = 3,n + 1部分就会引用一个未定义的元素,从而引发错误。
要解决此问题,您需要达到(n <长度-1)