如何在JavaScript中根据数组匹配设置对象数组的status属性
解决对象数组匹配普通数组设置状态的问题
需求:将对象数组arrObj中name属性与普通数组arr内元素匹配的对象的status设为true,不匹配的设为false,期望输出格式如下:
[ { name: "Test1", status: true }, { name: "Test2", status: false }, { name: "Test3", status: true } ]
原代码问题分析
你的代码存在两处关键错误:
- 直接访问
arrObj.name和arrObj.status,但arrObj是数组而非单个对象,无法正确获取每个元素的属性 - 仅处理了匹配的情况,未覆盖不匹配的对象,无法将这些对象的
status设为false
正确解法
基础实现(直接修改原数组)
遍历arrObj中的每个对象,利用includes()判断当前对象的name是否在arr中,直接更新status:
let arrObj = [ { name: "Test1", status: true }, { name: "Test2", status: true }, { name: "Test3", status: true } ]; let arr = ["Test1", "Test3"]; arrObj.forEach(obj => { obj.status = arr.includes(obj.name); }); console.log(arrObj);
性能优化版(适合大数组场景)
当arr元素较多时,将arr转为Set可以提升查找效率(Set.has()的时间复杂度为O(1),而Array.includes()为O(n)):
let arrObj = [ { name: "Test1", status: true }, { name: "Test2", status: true }, { name: "Test3", status: true } ]; let arr = ["Test1", "Test3"]; const nameSet = new Set(arr); arrObj.forEach(obj => { obj.status = nameSet.has(obj.name); }); console.log(arrObj);
返回新数组(不修改原数组)
如果需要保留原数组不变,可以使用map()创建并返回新数组:
let arrObj = [ { name: "Test1", status: true }, { name: "Test2", status: true }, { name: "Test3", status: true } ]; let arr = ["Test1", "Test3"]; const nameSet = new Set(arr); const newArrObj = arrObj.map(obj => ({ ...obj, status: nameSet.has(obj.name) })); console.log(newArrObj);
内容的提问来源于stack exchange,提问作者EMahan K
相关产品推荐
相关产品推荐

