给Object.values(object)[i]赋值无效问题:对象新增属性返回undefined且无法重置为初始值
问题分析与解决方案
嘿,我来帮你拆解下问题出在哪!你的思路没问题——想把object里缺失/值为undefined的属性,从initialObject中补回来,但你用Object.values()的赋值方式完全无效,核心原因在这里:
为什么你的代码不生效?
Object.values(object)会返回一个包含对象值的新数组副本,你修改这个数组里的元素时,只是在修改副本,根本不会影响原object的属性。这就像你复印了一份文档,在复印件上涂改,原件完全不会有变化~
另外你的循环条件i != Object.keys(initalObject).length也不够稳妥,换成i < Object.keys(initalObject).length会更安全,避免出现意外的循环死锁。还有个小细节:你把initialObject拼写成了initalObject(少了一个字母i),虽然当前逻辑没受影响,但建议修正避免后续出错。
正确的实现方式
这里给你两种靠谱的解决方法:
方法1:遍历键名直接操作对象属性
直接遍历initialObject的所有键名,检查object中对应键是否存在或为undefined,如果是就从initialObject取值赋值:
const initialObject = { keyOne: true, keyTwo: "string", keyThree: 0 }; let object = { keyOne: true, keyTwo: "string" }; for (const key of Object.keys(initialObject)) { if (object[key] === undefined) { object[key] = initialObject[key]; } } console.log(object); // 输出:{ keyOne: true, keyTwo: "string", keyThree: 0 }
方法2:用展开运算符/Object.assign快速合并
如果只是想让object继承initialObject中缺失的属性,用ES6的展开运算符或者Object.assign会更简洁:
const initialObject = { keyOne: true, keyTwo: "string", keyThree: 0 }; let object = { keyOne: true, keyTwo: "string" }; // 方式A:展开运算符(推荐,更直观) object = { ...initialObject, ...object }; // 方式B:Object.assign object = Object.assign({}, initialObject, object); console.log(object); // 同样得到目标结果
这两种方式的逻辑是:先以initialObject为基础,再用object的属性去覆盖,这样object中已有的属性会保留,缺失的就会从initialObject补上。
内容的提问来源于stack exchange,提问作者Hamza Nasher-Alneam
相关产品推荐
相关产品推荐

