我有以下数组
var array = [
{id:"1",subject:"CE1",mark:"20"},{id:"1",subject:"CE2",mark:"30"},
{id:"2",subject:"CE1",mark:"40"},{id:"3",subject:"CE1",mark:"20"},
{id:"3",subject:"CE2",mark:"20"},{id:"1",subject:"CE1",mark:"40"},
{id:"1",subject:"CE2",mark:"30"},{id:"2",subject:"CE1",mark:"20"},
{id:"3",subject:"CE1",mark:"10"},{id:"3",subject:"CE2",mark:"10"}
]
我想要以下数组
var resultArray = [
{id:"1",subject:"CE1",mark:"60"},
{id:"1",subject:"CE2",mark:"60"},
{id:"2",subject:"CE1",mark:"40"},
{id:"3",subject:"CE1",mark:"30"},
{id:"3",subject:"CE2",mark:"30"}
]
我有以下代码,仅按ID对数组进行分组。
var totalArray = Object.values(array .reduce((a, {id, subject, mark}) => {
let totMark= mark;
if(a.hasOwnProperty(id)) {
a[id].mark+= totMark;
} else {
a[id] = {
id:id,
subject:subject,
mark:totMark,
}
}
return a;
}, {}));
如何使用javascript按两个属性对数组进行分组?
答案 0 :(得分:1)
您需要遵循类似的方法。您可以创建一个新密钥,而不是将id
作为累加器的密钥添加,它是要分组的两个密钥的组合。
var array = [
{id:"1",subject:"CE1",mark:"20"},{id:"1",subject:"CE2",mark:"30"},
{id:"2",subject:"CE1",mark:"40"},{id:"3",subject:"CE1",mark:"20"},
{id:"3",subject:"CE2",mark:"20"},{id:"1",subject:"CE1",mark:"40"},
{id:"1",subject:"CE2",mark:"30"},{id:"2",subject:"CE1",mark:"20"},
{id:"3",subject:"CE1",mark:"10"},{id:"3",subject:"CE2",mark:"10"}
]
var totalArray = Object.values(array.reduce((acc, { id, subject, mark }) => {
mark = +mark; // convert to number
const key = id + '_' + subject; // unique combination of id and subject
acc[key] = acc[key] || { id, subject, mark };
acc[key].mark += mark;
return acc;
}, {}));
console.log(totalArray)
答案 1 :(得分:1)
@adiga的答案将始终将第一个匹配键添加两次。第一次出现密钥时,我们不想将其添加到自身中!
此行
acc[key] = acc[key] || { id, subject, mark };
需要成为
acc[key] = acc[key] || { id, subject, mark: 0 };
最终摘要:
var array = [
{id:"1",subject:"CE1",mark:"20"},{id:"1",subject:"CE2",mark:"30"},
{id:"2",subject:"CE1",mark:"40"},{id:"3",subject:"CE1",mark:"20"},
{id:"3",subject:"CE2",mark:"20"},{id:"1",subject:"CE1",mark:"40"},
{id:"1",subject:"CE2",mark:"30"},{id:"2",subject:"CE1",mark:"20"},
{id:"3",subject:"CE1",mark:"10"},{id:"3",subject:"CE2",mark:"10"}
]
var totalArray = Object.values(array.reduce((acc, { id, subject, mark }) => {
mark = +mark; // convert to number
const key = id + '_' + subject; // unique combination of id and subject
acc[key] = acc[key] || { id, subject, mark: 0 };
acc[key].mark += mark;
return acc;
}, {}));
console.log(totalArray)