如何为默认未定义的对象动态添加嵌套字段?
问题分析与解决方案
首先得指出你代码里的几个核心问题:
this._champ初始是未定义的,但你直接对它操作,还错误地用了数组的push方法——this._champ应该是对象(因为你要通过champ.name作为键存储嵌套结构),对象没有push方法,这是你三元运算符无效的主要原因。ele.infos[0].StackableRangeName始终为undefined,直接用它当对象键的话,会生成一个键名为"undefined"的属性,这大概率不是你想要的结果。- 首次处理
champ.name时,对应的属性不存在,需要先初始化该属性为一个空对象,才能继续给它添加子属性。
修正后的代码实现
我们一步步来解决这些问题:
// 第一步:先确保this._champ是一个对象,初始未定义的话就初始化 if (!this._champ) { this._champ = {}; } // 获取当前要操作的 champ 名称 const champKey = champ.name; // 处理可能为undefined的StackableRangeName,给个默认键名(比如"defaultRange",你可以根据需求修改) const rangeKey = ele.infos?.[0]?.StackableRangeName || "defaultRange"; // 获取当前 champ 对应的对象,不存在就初始化空对象 const champObj = this._champ[champKey] || {}; // 赋值 champObj[rangeKey] = ele.value; // 把赋值后的对象放回this._champ this._champ[champKey] = champObj;
代码解释
- 初始化
this._champ:先判断如果它未定义,就把它设置为空对象,避免后续操作报错。 - 安全获取
rangeKey:用可选链ele.infos?.[0]?.StackableRangeName防止ele.infos为空或者ele.infos[0]不存在导致的报错,同时用||给一个默认键名,避免出现"undefined"的键。 - 初始化
champObj:如果this._champ[champKey]还不存在,就先创建一个空对象,这样后续可以安全地给它添加子属性。 - 赋值并更新:把值赋给
champObj对应的键,再把champObj存回this._champ,确保嵌套结构正确。
简化写法(可选)
如果你喜欢更简洁的写法,可以用逻辑赋值运算符和可选链来压缩代码:
// 初始化this._champ this._champ ??= {}; // 初始化champ对应的对象 this._champ[champ.name] ??= {}; // 处理键名并赋值 const rangeKey = ele.infos?.[0]?.StackableRangeName || "defaultRange"; this._champ[champ.name][rangeKey] = ele.value;
额外说明
如果ele.infos[0].StackableRangeName始终为undefined是一个异常情况(比如数据获取错误),你可能需要先排查数据来源的问题;如果这是正常业务场景,那上面的默认键名处理就完全适用。
内容的提问来源于stack exchange,提问作者Izio
相关产品推荐
相关产品推荐

