Angular中为何数组索引0可正常push,索引1报testresults未定义错误
问题根本原因
报错的核心是你给tests数组推入第二个元素时,入参结构写错,导致tests[1]不是预期的带testresults属性的对象。
具体错误拆解
tests的初始结构是对象数组,第一个元素tests[0]是符合预期的对象:// 初始赋值后,tests[0] 结构: { status: 0, testresults: [{ name: 'test', id: 1 }] }因此访问
this.tests[0].testresults能拿到合法数组,执行push自然不会报错。你给
tests推入第二个元素时,错误地将原本要推入的对象额外包了一层数组作为入参:
你实际写的push逻辑等价于:// 错误写法:把对象包在数组里作为push入参 this.tests.push( [ { status:1, testresults: [...] } ] );这就导致
tests[1]的实际值是一个长度为1的数组(里面装着你要的status=1的对象),而非你预期的、直接带testresults属性的对象。你之所以觉得初始化逻辑“运行符合预期”,是因为push后
tests的长度确实变成了2,但你没有校验第二个元素的实际结构——数组长度变化不代表元素结构符合预期。
此时访问this.tests[1].testresults会得到undefined,对undefined执行push操作就会抛出你遇到的Cannot read property 'push' of undefined错误。附加问题:你写的push代码存在括号不匹配的语法冗余,这部分大概率是排版失误导致的,即使编译/运行时未触发语法错误,入参结构的错误依然存在。
正确写法
给tests推入元素时,直接传入目标对象即可,不要额外包裹数组:
this.tests.push({ status: 1, testresults: [{ name: 'test2', id: 2 }] });
修改后tests[1]就是符合结构的对象,后续对testresults的push操作可正常执行。
内容的提问来源于stack exchange,提问作者user68288
相关产品推荐
相关产品推荐

