JavaScript动态给嵌套对象添加键值对报undefined错误如何解决
报错原因
- 核心问题是访问路径上的对象未提前初始化:初始结构里
result.Furnaces是空对象,你直接链式访问result["Furnaces"][furnaceName]["Raw Material"]时,result["Furnaces"][furnaceName]这个节点根本不存在,JS读取不存在的对象属性会返回undefined,无法给undefined设置属性,就会抛出你看到的类型错误。 - 额外还有个笔误:你循环里定义的遍历数组是
furnaces,取元素时写的是furnace[i],变量名少写了末尾的s,就算提前初始化了子对象,这个拼写错误也会导致取到的熔炉名异常,触发同类报错。 - 你之前给AV对象加键值对不报错,是因为你只访问了一层已存在的对象:
result["AV"]本身就是初始化好的空对象,直接给它加一级属性是合法操作,不需要额外初始化。
正确实现方法
赋值前先检查路径上的子对象是否存在,不存在就先初始化为空对象,再往里写属性即可,修正后的完整代码如下:
const result = { AV: {}, Furnaces: {}, "Production Lines": {} }; // 替换成你实际的熔炉名称列表即可 const furnaces = ["1号熔炉", "2号熔炉", "3号熔炉"]; for (let i = 0; i < furnaces.length; i++) { // 修正原代码的变量拼写错误 const furnaceName = furnaces[i]; // 不存在对应熔炉的子对象时,先初始化空对象 if (!result.Furnaces[furnaceName]) { result.Furnaces[furnaceName] = {}; } // 子对象初始化完成后再赋值属性 result.Furnaces[furnaceName]["Raw Material"] = 5; }
执行后最终得到的result.Furnaces结构如下,完全符合动态新增子对象再加键值对的需求:
{ "1号熔炉": { "Raw Material": 5 }, "2号熔炉": { "Raw Material": 5 }, "3号熔炉": { "Raw Material": 5 } }
内容的提问来源于stack exchange,提问作者Manuel Pinto
相关产品推荐
相关产品推荐

