如何使用纯JavaScript按name字段对数组分组并统计?
纯JavaScript实现按姓名分组并计算总分、百分比
你可以用Array.prototype.reduce方法来完成这个分组和计算需求,下面是具体实现:
const array = [ { name: "kano", subject: "gujarati", marks: 99 }, { name: "kano", subject: "maths", marks: 99 }, { name: "kano", subject: "hindi", marks: 99 }, { name: "dixit", subject: "hindi", marks: 80 }, { name: "dixit", subject: "maths", marks: 80 }, { name: "dixit", subject: "gujarati", marks: 80 }, ]; const groupedResult = array.reduce((acc, item) => { // 如果当前姓名还没在累加器里,初始化基础结构 if (!acc[item.name]) { acc[item.name] = { total: 0 }; } // 添加科目和对应分数 acc[item.name][item.subject] = item.marks; // 累加总分 acc[item.name].total += item.marks; return acc; }, {}); // 计算每个学生的百分比(总分除以科目数量) Object.keys(groupedResult).forEach(name => { // 排除total字段,统计实际科目数量 const subjectCount = Object.keys(groupedResult[name]).filter(key => key !== 'total').length; groupedResult[name].percentage = groupedResult[name].total / subjectCount; }); console.log(groupedResult);
代码说明:
- reduce分组:用reduce遍历原数组,累加器
acc存储最终分组结果。遇到新姓名时,先初始化包含total(初始为0)的对象;已有姓名则直接更新对应数据。 - 填充科目数据:把当前元素的
subject作为键、marks作为值,添加到对应姓名的对象中。 - 累加总分:每遍历一个元素,就将对应分数加到该姓名的
total字段里。 - 计算百分比:遍历分组后的结果,对每个学生统计其科目数量(排除
total字段),用总分除以科目数得到百分比。
这个实现是通用的——哪怕不同学生的科目数量不一致,也能正确计算出百分比。
内容的提问来源于stack exchange,提问作者mansukh
相关产品推荐
相关产品推荐

