如何通过JavaScript循环匹配姓名为JSON数组学生对象添加ComputersMarks字段
实现自动匹配添加ComputersMarks字段的方案
直接替换你代码里手动赋值的4行代码即可,下面提供两种实现方式:
方式1:映射表匹配(推荐,时间复杂度更低)
先把AnotherSubject转换为以学生姓名为键的查找表,再遍历学生数组统一赋值,代码如下:
// 先构建成绩查找映射 const marksMap = {} AnotherSubject.forEach(item => { marksMap[item.name] = item.ComputersMarks }) // 遍历学生数组添加字段 StudentsArray.forEach(student => { student.ComputersMarks = marksMap[student.Name] })
替换掉原来的4行手动赋值代码即可,最终完整运行代码如下:
let Student1={ Name:"Mark", MathMarks:80, EnglishMarks:75, ScienceMarks:63, } let Student2={ Name:"Bob", MathMarks:90, EnglishMarks:81, ScienceMarks:88, } let Student3={ Name:"Julia", MathMarks:88, EnglishMarks:87, ScienceMarks:89, } let Student4={ Name:"Anthony", MathMarks:60, EnglishMarks:64, ScienceMarks:61, } let AnotherSubject=[ {name:'Mark', ComputersMarks:90}, {name:'Anthony', ComputersMarks:70}, {name:'Julia', ComputersMarks:88}, {name:'Bob', ComputersMarks:81}] StudentsArray=[Student1,Student2,Student3,Student4] let StudentMarks={ students:StudentsArray } // 替换手动赋值的代码 const marksMap = {} AnotherSubject.forEach(item => { marksMap[item.name] = item.ComputersMarks }) StudentsArray.forEach(student => { student.ComputersMarks = marksMap[student.Name] }) console.log(StudentMarks.students)
方式2:双层循环匹配(适合小数据量场景)
如果不想额外生成映射表,也可以直接双层循环匹配姓名:
StudentsArray.forEach(student => { const matchItem = AnotherSubject.find(item => item.name === student.Name) if (matchItem) { student.ComputersMarks = matchItem.ComputersMarks } })
两种方式运行后输出的结果和你原来手动赋值的结果完全一致,后续如果新增学生或者新增成绩数据,不需要再手动修改赋值代码。
内容的提问来源于stack exchange,提问作者parkplug
相关产品推荐
相关产品推荐

