JavaScript嵌套对象添加键值对报错:Cannot set property of undefined
解决JavaScript嵌套对象添加键值对的报错问题
首先,咱们拆解你遇到的两个核心问题:为什么点语法达不到预期,以及为什么会出现cannot set property of undefined的报错。
1. 点语法 vs 方括号语法的区别
你尝试的myDict[key1].identifier = info是有问题的——JavaScript的点语法会把.后面的内容当成字面量的键名,而不是变量的值。也就是说,这行代码其实是在给myDict[key1]添加一个名为identifier的键,而不是你变量identifier里存储的foo。
要使用变量作为键名,必须用方括号语法,也就是你第一种写法的myDict[key1][identifier] = info,这部分的思路是完全正确的。
2. 为什么会报错cannot set property of undefined
这个报错说明你要赋值的目标对象不存在——也就是myDict[key1]是undefined,常见原因有两种:
myDict本身没有key1这个键,比如初始化时漏写了,或者拼写错误;myDict[key1]的值不是对象(比如被设为字符串、数字,或者被重置成了undefined)。
3. 实现目标结构的正确步骤
要顺利添加内部键值对,咱们需要先保证目标嵌套对象存在,再用方括号语法赋值,分两种场景处理:
场景1:确定myDict[key1]已经是一个对象
如果你的myDict初始化时就明确有key1且值为对象,直接用方括号语法即可:
// 初始化目标对象 let myDict = { key1: { innerKey1: 'innerValue1', innerKey2: 'innerValue2' }, key2: {} }; const someArray = ['foo', 'bar']; const identifier = someArray[0]; const info = someArray[1]; // 直接用方括号语法添加键值对 myDict.key1[identifier] = info; // 此时myDict的结构就是你想要的: // { key1: { innerKey1: 'innerValue1', innerKey2: 'innerValue2', foo: 'bar' }, key2: {} }
场景2:不确定myDict[key1]是否存在或是否为对象
如果你的项目中key1可能动态生成、不一定存在,那就要先初始化这个嵌套对象:
let myDict = { key2: {} }; // 这里初始没有key1 const someArray = ['foo', 'bar']; const identifier = someArray[0]; const info = someArray[1]; // 先检查并初始化myDict[key1]为对象 if (!myDict.key1) { myDict.key1 = {}; } // 再添加键值对 myDict.key1[identifier] = info;
这样就能避免undefined的报错,顺利生成你想要的嵌套结构。
内容的提问来源于stack exchange,提问作者Shushiro
相关产品推荐
相关产品推荐

