You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用纯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);

代码说明:

  1. reduce分组:用reduce遍历原数组,累加器acc存储最终分组结果。遇到新姓名时,先初始化包含total(初始为0)的对象;已有姓名则直接更新对应数据。
  2. 填充科目数据:把当前元素的subject作为键、marks作为值,添加到对应姓名的对象中。
  3. 累加总分:每遍历一个元素,就将对应分数加到该姓名的total字段里。
  4. 计算百分比:遍历分组后的结果,对每个学生统计其科目数量(排除total字段),用总分除以科目数得到百分比。

这个实现是通用的——哪怕不同学生的科目数量不一致,也能正确计算出百分比。

内容的提问来源于stack exchange,提问作者mansukh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:05:19