如何在JavaScript中遍历两对象并匹配键更新目标对象值
解决对象属性匹配填充问题
先明确你原代码的核心错误:
- 对象没有
length属性,task.length和data.length都是undefined,循环根本不会执行 - 用
==比较Object.keys返回的数组,数组是引用类型,只有引用完全相同时才会相等,这里永远为false Object.values(task) = Object.values(data)是错误赋值方式,Object.values返回的是值的副本数组,修改它不会影响原对象- 内层循环变量写错,把
n++写成了a++,就算循环执行也会触发死循环
正确实现方式(修改原task对象)
task是const声明的,但对象的属性可以修改(const仅限制变量的引用,不限制对象内部属性)。我们可以遍历task的所有键,检查taskData中是否存在该键,存在则赋值:
// 获取task的所有属性键 const taskKeys = Object.keys(task); // 遍历每个键,匹配赋值 taskKeys.forEach(key => { // 用hasOwnProperty确保是taskData自身的属性,避免继承属性干扰 if (taskData.hasOwnProperty(key)) { task[key] = taskData[key]; } }); // 查看填充后的结果 console.log(task);
不修改原对象,生成新对象的方式
如果不想改变原task对象,可以创建新对象存储结果:
// 先复制task的所有属性,再用taskData中匹配的属性覆盖 const filledTask = { ...task }; Object.keys(filledTask).forEach(key => { if (taskData.hasOwnProperty(key)) { filledTask[key] = taskData[key]; } }); console.log(filledTask);
或者用更简洁的链式写法:
const filledTask = { ...task, ...Object.fromEntries( Object.keys(task) .filter(key => taskData.hasOwnProperty(key)) .map(key => [key, taskData[key]]) ) };
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

