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
相关产品推荐
相关产品推荐

