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

JavaScript实现姓名-成绩数组转换为按姓名分组的目标格式对象

实现思路

核心逻辑分3步走,没有复杂依赖:

  • 先创建一个空对象作为分组结果的容器
  • 遍历原始数组的每一项,对每个字符串用split('-')做切割,分离出学生姓名、成绩两个值,注意把切割出来的成绩字符串转成数字类型,避免后续做数值计算出错
  • 遍历过程中做判断:如果结果容器里没有当前学生的属性,就先给这个学生初始化一个空数组作为值;如果已经存在对应属性,直接把当前成绩追加到该学生的成绩数组末尾即可
实现代码

新手友好版(普通for循环,无高阶方法,易读性高)

const rawList = [
 "John-100",
 "Mark-120",
 "John-50",
 "Mark-130"
]
const groupResult = {}

for (let i = 0; i < rawList.length; i++) {
  const currentItem = rawList[i]
  // 拆分姓名和成绩
  const [studentName, scoreText] = currentItem.split('-')
  const score = Number(scoreText)
  // 不存在该学生记录就先初始化空数组
  if (!groupResult[studentName]) {
    groupResult[studentName] = []
  }
  // 追加成绩
  groupResult[studentName].push(score)
}

// 打印验证,输出就是你需要的 { John: [100, 50], Mark: [120, 130] }
console.log(groupResult)

简洁版(数组reduce方法实现)

熟悉数组高阶方法后,可以用reduce简化遍历逻辑,效果和上面完全一致:

const groupResult = rawList.reduce((resultMap, currentItem) => {
  const [studentName, scoreText] = currentItem.split('-')
  if (!resultMap[studentName]) resultMap[studentName] = []
  resultMap[studentName].push(Number(scoreText))
  return resultMap
}, {})
其他可选聚合格式方案

如果后续需要做成绩统计、大数据量处理,可以参考这两种更实用的结构:

  • 带预计算统计值的对象结构:除了存原始成绩列表,提前算好总分、平均分,避免后续使用时重复计算
{
  "John": {
    scoreList: [100, 50],
    totalScore: 150,
    averageScore: 75
  },
  "Mark": {
    scoreList: [120, 130],
    totalScore: 250,
    averageScore: 125
  }
}
  • Map结构:相比普通对象,Map对键的类型支持更灵活,大数量级下遍历、增删性能更好,适合数据量较大的场景
// 最终结构:Map(2) { 'John' => [100, 50], 'Mark' => [120, 130] }
const groupResult = new Map()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:39:15