具有这种形式的二维数组:
arr = [
["12325-a", 1, 1, 1],
["43858-b", 3, 4, 1],
["84329-a", 6, 5, 2],
["18767-b", 0, 9, 0],
["65888-b", 5, 4, 4],
];
在每个子数组上,第一个元素是一个字符串。
我想将末端相同的子数组组合在一起。在这种情况下,将分为两组:-a
和-b
。
数值应基于等式求和。
所以结果看起来像:
arr = [
["-a", 7, 6, 3],
["-b", 8, 17, 5],
];
我的解决方案(无效):
let arr = [
["12325-a", 1, 1, 1],
["43858-b", 3, 4, 1],
["84329-a", 6, 5, 2],
["18767-b", 0, 9, 0],
["65888-b", 5, 4, 4],
];
result = arr.reduce(function(acc, curr) {
if (acc[curr[0].substr(curr[0].length - 2)]) {
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(result)
答案 0 :(得分:4)
在检查现有值并映射到现有数据时,您使用的密钥不正确。您的解决方案看起来像
let arr = [
["12325-a", 1, 1, 1],
["43858-b", 3, 4, 1],
["84329-a", 6, 5, 2],
["18767-b", 0, 9, 0],
["65888-b", 5, 4, 4],
];
result = arr.reduce(function(acc, curr) {
const key = curr[0].substr(curr[0].length - 2);
console.log(key)
if (acc[key]) {
acc[key] = acc[key].map(function(val, index) {
if (index) {
return val + curr[index];
}
return val;
});
} else {
acc[key] = [curr[0].substr(curr[0].length - 2), ...curr.slice(1)]
}
return acc;
}, {});
console.log(Object.values(result));
答案 1 :(得分:3)
您可以先使用reduce
方法创建对象,然后使用Object.values
获取值数组。
const arr = [
["12325-a", 1, 1, 1],
["43858-b", 3, 4, 1],
["84329-a", 6, 5, 2],
["18767-b", 0, 9, 0],
["65888-b", 5, 4, 4],
];
const result = arr.reduce((r, [str, ...rest]) => {
let key = str.split(/(\d+)/).pop();
if(!r[key]) r[key] = [key, ...rest];
else rest.forEach((e, i) => r[key][i + 1] += e)
return r;
}, {})
console.log(Object.values(result))
答案 2 :(得分:0)
使用object减少创建一个对象,其中第一个字符串的最后两个字符将成为键。该键的值将是一个数组,其中将包含下一组下一个值。
在第二种情况下,如果对象已经具有键,则获取索引并对其求和。
最后,您可以执行Object.values
来获取数组
let arr = [
["12325-a", 1, 1, 1],
["43858-b", 3, 4, 1],
["84329-a", 6, 5, 2],
["18767-b", 0, 9, 0],
["65888-b", 5, 4, 4],
];
let x = arr.reduce(function(acc, curr) {
// getting last two characters from first string
let getSubstring = curr[0].slice(-2);
//checking if object has a key with this name.
// if not then create it
if (!acc.hasOwnProperty(getSubstring)) {
acc[getSubstring] = [];
// now iterate over the rest of the values and push them
for (let i = 1; i < curr.length; i++) {
acc[getSubstring].push(curr[i])
}
} else {
// if already a key exist then create an array of the elements except the first value
let newArray = curr.splice(1, curr.length);
newArray.forEach(function(item, index) {
acc[getSubstring][index] = acc[getSubstring][index] + item
})
}
return acc;
}, {});
for (let keys in x) {
x[keys].unshift(keys)
}
console.log(Object.values(x))