使用jQuery构建含动态键的嵌套Object/Array 解决读取undefined报错
问题原因
JavaScript 不会自动为你创建嵌套对象/数组的中间层级,你代码中直接访问fieldTickets[thisWeek]时,该动态键对应的值还未初始化,结果为undefined,此时再尝试读取它的days属性就会触发你遇到的报错。
另外注意:如果你的动态键thisWeek是日期字符串等非数字类型,fieldTickets应该声明为普通对象{}而非数组[],数组仅适合用数字作为索引的场景。
正确实现方案
你需要在访问深层属性前,逐层初始化所有中间层级的对象/数组:
兼容所有运行环境的写法
// 顶层用对象存储非数字索引的周次数据 const fieldTickets = {}; const thisWeek = randomDateOnSunday; const weekDay = randomWeekDayWithinTheWeek; const fieldTechName = '你从表单获取的技术人员名称'; // 初始化周次层,不存在则创建带days属性的对象 if (!fieldTickets[thisWeek]) { fieldTickets[thisWeek] = { days: {} }; } // 初始化工作日层,不存在则创建带fieldTechs空数组的对象 if (!fieldTickets[thisWeek].days[weekDay]) { fieldTickets[thisWeek].days[weekDay] = { fieldTechs: [] }; } // 此时所有层级都已初始化,可以安全push数据 fieldTickets[thisWeek].days[weekDay].fieldTechs.push({name: fieldTechName});
ES2020+ 简洁写法
如果你的运行环境支持ES2020及以上语法(现代浏览器、Node.js 15+),可以用空值合并赋值运算符简化初始化逻辑:
const fieldTickets = {}; const thisWeek = randomDateOnSunday; const weekDay = randomWeekDayWithinTheWeek; const fieldTechName = '你从表单获取的技术人员名称'; // 逐层兜底初始化,属性不存在时才会赋值 fieldTickets[thisWeek] ??= { days: {} }; fieldTickets[thisWeek].days[weekDay] ??= { fieldTechs: [] }; fieldTickets[thisWeek].days[weekDay].fieldTechs.push({name: fieldTechName});
内容的提问来源于stack exchange,提问作者maximus1127
相关产品推荐
相关产品推荐

