具有一个包含许多子阵列的矩阵。每个数组具有相同的长度,每个数组的第一个元素是一个字符串,后跟具有以下形式的数字元素:
myArray = [
["revenues", 10, 20, 30],
["expenses", 1, 1, 1],
["expenses", 2, 3, 4],
["revenues", 5, 6, 7],
];
我的目标是通过字符串将它们组合起来,并计算每个位置的总和。对于以上示例,结果必须为:
result = [
["revenues", 15, 26, 37],
["expenses", 3, 4, 5],
];
我试图通过按字符串的值映射它们,然后计算每个位置的总和来做到这一点。它仅适用于在第一阶段包含“收入”但仍无法正常工作的子数组字符串。
result = myArray.map(s => s[0].includes("revenues")).reduce(function (r, a) {
a.forEach(function (b, i) {
r[i] = (r[i] || 0) + b;
});
return r;
}, []);
有什么建议吗?
答案 0 :(得分:4)
您可以在临时结果中找到子数组,或者将该数组添加到结果集中。
var array = [["revenues", 10, 20, 30], ["expenses", 1, 1, 1], ["expenses", 2, 3, 4], ["revenues", 5, 6, 7]],
result = array.reduce((r, a) => {
var sub = r.find(([key]) => key === a[0]);
if (!sub) {
return r.concat([a]);
}
a.forEach((v, i) => i && (sub[i] += v));
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
var myArray = [
["revenues", 10, 20, 30],
["expenses", 1, 1, 1],
["expenses", 2, 3, 4],
["revenues", 5, 6, 7],
];
var result = myArray.reduce(function(acc, curr) {
if (acc[curr[0]]) {
acc[curr[0]] = acc[curr[0]].map(function(val, index) {
if (index) {
return val + curr[index];
}
return val
})
} else {
acc[curr[0]] = curr;
}
return acc
}, {})
console.log(Object.values(result))