javascript - Kombinera del-arrayer genom att använda en delsträng som finns i det första elementet i varje del-array som en nyckel
Att ha en tvådimensionell matris av denna form:
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],
];
På varje del-array är det första elementet en sträng.
Jag vill kombinera sub-arrayerna som har samma slut. I det här fallet blir det två grupper: -a och -b.
De numeriska värdena bör beräknas som en summa baserad på index.
Så resultatet skulle se ut så här:
arr = [
["-a", 7, 6, 3],
["-b", 8, 17, 5],
];
min lösning (som inte fungerar):
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)Svar #1
Du kan först använda reduce-metoden för att skapa ett objekt och sedan Object.values för att få en matris av värden.
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))Svar #2
Du använder inte rätt nyckel när du kontrollerar för befintligt värde och mappar över de befintliga uppgifterna. Din lösning skulle se ut som
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));