JavaScript中对比对象数组与值数组 补全对象数组缺失项
实现方法
核心逻辑分两步走:
- 先提取
worksheet中已经存在的所有学生姓名,用Set存储以提升存在性判断的效率 - 遍历
data.student_names全量名单,把不在已存在名单里的学生按要求构造新对象,追加到worksheet末尾,原有记录的顺序、内容都不会改动
注意:你提供的示例代码里Test 3对应的对象存在语法错误,多写了一个冗余的
"file"字符串,运行前需要先修正这个笔误。
直接修改原数组的实现
// 修正语法错误后的初始数据 var worksheet = [ {"student_name": "Test 1", "file": "some_file_name.txt"}, {"student_name": "Test 3", "file": "some_file_name.txt"} ] var data = {"student_names": ["Test 1", "Test 2", "Test 3", "Test 4"]} // 提取已存在的学生姓名集合 var existingStudentNames = new Set(worksheet.map(item => item.student_name)) // 遍历补全缺失记录 data.student_names.forEach(function(name) { if (!existingStudentNames.has(name)) { worksheet.push({ student_name: name, file: "" }) } })
运行后worksheet的输出和你给出的预期结果完全一致:原有Test1、Test3的记录保持不变,Test2、Test4按名单顺序追加到数组末尾,file属性值为空字符串。
不修改原数组的实现
如果你需要保留原始worksheet不被改动,可以用浅拷贝生成新数组:
var existingStudentNames = new Set(worksheet.map(item => item.student_name)) var newWorksheet = [ // 先放入原有所有记录 ...worksheet, // 拼接过滤出的缺失学生记录 ...data.student_names .filter(name => !existingStudentNames.has(name)) .map(name => ({student_name: name, file: ""})) ]
内容的提问来源于stack exchange,提问作者Shend Tytynxhiu
相关产品推荐
相关产品推荐

