开发者问题收集

将对象添加到空对象数组中

2023-01-03
599

手头的问题与 Angular 应用的 Typescript 部分有关。

我有一个从订阅中收到的数据数组;它包含多个(但数量不一致或不可预测的)对象,这些对象具有成员“titleName”和“ID”。我需要添加成员“toggle”,它将在组件内进行交互。由于有问题的数据库调用及其其他用途,我无法在服务端添加“toggle”。 我尝试了以下操作:

titlesraw;
titles: any;

...

getTitles() {
   this.getTitles.subscribe(
   data => {
      this.titlesraw = data;
      console.log(this.titlesraw); //console reads what I expect
      for (var i = 0; i < this.titlesraw.length; i++) {
           let title = {
             id: this.titlesraw[i]["ID"];
             titleName: this.titlesraw[i]["titleName"];
             toggle: true;
           }
           console.log(title); //console reads what I expect
           this.titles.push(title);
          }
       }
    )
}

当我运行代码时,出现以下错误:

ERROR TypeError: Cannot read properties of undefined (reading 'push') at <line with this.titles.push(title)>

我认为这是因为我没有正确声明 titles 。我需要做些什么不同的事情?

编辑:我已将 titles: any; 更改为 titles: any[] = []; ,但出现以下错误:

Cannot read properties of undefined (reading 'ID') at <line with this.titles.push(title)>.

再次,当我打印临时变量 title 时,它显示了 完全 我所期望的内容。

2个回答

您可以使用 map 函数轻松完成此操作。

让我向您解释一下。在这里,我假设您正在从 Api 调用接收一个 arrayobjects 。您可以像这样使用 arraysmap 函数修改您的响应。

titles = [];
this.getTitles.subscribe(data => {
  this.titles = data.map((titleObject) => {
    titleObject.toggle = true;
    return titleObject;
  })
})
Fahad Subzwari
2023-01-03

好吧,首先让我指出一些使用 TypeScript 时的良好做法。

  1. 坚持使用类型并避免使用 any 。查看 这篇文章 以更好地理解。但基本上,当您开始使用 any 时,当超过 500 名语言贡献者提供帮助时,您“...正在说 不谢谢 。听起来选择退出类型检查器,并因此失去对我们的类型系统的所有安全性和信心不应该是一个轻率的决定。”我并不是说你永远不应该使用它,即使在某些情况下你会需要它,所以请避免使用它,特别是在这种特定情况下。

  2. 为你的对象创建类型/模型。

  3. 你不需要 titlesraw ,至少在你显示的这段代码中不需要。

基于它并回答你的问题,问题是由于 titles 不是 Array 类型。 pushArray 类型的一种方法,因此你的 titles 应该是 Array 才能使其工作。

话虽如此,你的代码应该是这样的:

class Title {
  id: number;
  titleName: string;
  toggle: boolean;
}

titles: Title[] = [];

...

getTitles() {
   this.getTitles.subscribe(data => {
      for (var i = 0; i < this.data.length; i++) {
           const title: Title = {
             id: this.data[i]["ID"],
             titleName: this.data[i]["titleName"],
             toggle: true
           }
           this.titles.push(title);
          }
       }
    )
}
Athus Vieira
2023-01-03