网站搜索

typescript - 在 angular 中访问该对象时获取 undefined


我有两个对象 OldAnswer 和 NewAnswer。我正在尝试将 OldAnswer 对象数组转换为 NewAnswer 对象数组。

export class AnswerComponent implements OnInit {


answers: OldAnswer[] = [/* some data  */];

newanswers: NewAnswer[];

constructor() {


    this.answers.forEach(function (answer) {

        answer.answers.forEach(function (a){

            for (var key in a) {
                text = // some logic"";     
            }
            // exception in below line
        this.newanswers.push({id: answer.observationId,answer: text});
        });
    });

    }

}

但是我收到“无法在未定义上调用 newanswers”。为什么这里的 this 对象是 undefined,而在访问 answers 时却不是?

答案#1

你声明了数组但没有初始化。修复:

newanswers: NewAnswer[] = [];

此外,你需要使用箭头函数,这样你的作用域就不会改变

this.answers.forEach(answer => { 
  answer.answers.forEach( (a) => { 
    for (var key in a) { 
      text = // some logic""; 
    } // exception in below line 

    this.newanswers.push({id: answer.observationId,answer: text}); 
}); }); }

答案#2

问题原因:

你使用了 forEach 和 function()

解决方案:

在 forEach 中使用箭头函数来定义你的函数:

this.answers.forEach((answer) => {

    answer.answers.forEach((a) => {

为什么箭头函数可以解决这个问题:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_separate_this

直到箭头函数出现之前,每个新定义的函数都会定义自己的 this 值(基于函数的调用方式,在构造函数的情况下为一个新对象,严格模式函数调用中为 undefined,如果函数作为“对象方法”调用则为基础对象,等等)。这种方式在面向对象的编程风格中被证明并不理想。

(强调为我所加).

由于 Angular/TypeScript 会生成严格模式的 JavaScript,this 在 function() {} 的函数体内将是 undefined,它将不再引用你类的对象实例。

注意:还有其他“老派的 JavaScript 方法”可以解决这个问题,但箭头函数现在确实是在 TypeScript/Angular/ES6 中在大多数类似情况下通常使用的方法。

在对数组调用 push() 之前,也要先初始化它

然而,你也会遇到 newanswers 未定义的问题(至少在你提供的示例中是这样,所以正如 Simonare 所指出的,你也应该将它初始化为空数组 [])。