typescript 从数组中删除对象时出现类型脚本错误

hc2pp10m  于 2022-12-24  发布在  TypeScript
关注(0)|答案(2)|浏览(222)

在angular中的一个项目中,我有一个包含多个元素的表格,每行都有一个按钮,用于删除相应的行。在按钮中,我插入了一个事件,单击该事件将调用一个函数并传递对象的id:

<button mat-flat-button (click)="removePhase(phase.id)">
   <span><mat-icon>close</mat-icon></span>
</button>

按下时调用此函数:

removePhase(id:number){
    console.log(this.phase) /*First log*/
    this.phase.forEach((element) => {
    if (element.id != id) {
      this.phaseRemove.push(element);
      }
    })
    this.phaseRemove.forEach((element, index) => {
      element.id = index;
    })
    this.phase = this.phaseRemove;
    this.dataSource = new MatTableDataSource(this.phase);
    console.log(this.phase) /*Second log*/
  }

这是相位对象:

[
    {
        "id": 0,
        "phaseName": "Phase 1"
    },
    {
        "id": 1,
        "phaseName": "Phase 2"
    },
    {
        "id": 2,
        "phaseName": "Phase 3"
    },
    {
        "id": 3,
        "phaseName": "Phase 4"
    }
]

当函数第一次启动时,一切正常,而当我第二次启动它时,它会循环第一次for。我输入了两个控制台日志,看看会发生什么,在第一个日志中,我得到了这个对象(在这个日志中,我按下按钮删除id为0的对象):

[
    {
        "id": 0,
        "phaseName": "Phase 1",
    },
    {
        "id": 0,
        "phaseName": "Phase 2",
    },
    {
        "id": 1,
        "phaseName": "Phase 3",
    },
    {
        "id": 2,
        "phaseName": "Phase 4",
    }
]

在第二个日志中,我得到了正确的对象:

[
    {
        "id": 0,
        "phaseName": "Phase 2",
    },
    {
        "id": 1,
        "phaseName": "Phase 3",
    },
    {
        "id": 2,
        "phaseName": "Phase 4",
    }
]

正如你所看到的,第一个对象的控制台日志也将id 0设置为第二个对象,我认为这是无限for循环错误,但我不知道如何解决它,谢谢。

5jvtdoz2

5jvtdoz21#

我认为有更好的方法从这个集合中删除该项目
使用对象引用删除任何单击的项目\

removePhase(id:number){ 
   // but becareful here we override the main list again then we add it to the data source  
    this.phase = this.phase.filter(item => item.id !== id)
    this.dataSource = new MatTableDataSource(this.phase);
    console.log(this.phase) // will have your items without the clicked one 
}
w6mmgewl

w6mmgewl2#

removePhase(id:number){
    this.phaseRemove = [];
    console.log(this.phase) /*First log*/
    for(const element of this.phase) {
      if (element.id != id) {
        this.phaseRemove.push(element);
      }
    }
    for (let i=0 ; i< this.phaseRemove.length; i++){
      this.phaseRemove[i].id = i;
    }
    this.phase = JSON.parse(JSON.stringify(this.phaseRemove));
    this.dataSource = new MatTableDataSource(this.phase);
    console.log(this.phase) /*Second log*/
}

此问题是由于this.phase和this.phaseRemove之间存在引用而导致的。它们是指向内存中一个位置的类似对象。
你应该使用JSON.parse(JSON.stringify())断开它们的引用,然后你会让它们成为完全不同的对象。

相关问题