首页 > 解决方案 > 从未知动态对象中删除特定的已知属性

问题描述

我有一个函数,它接受一个动态对象并以角度打字稿返回一个对象:

  public clean(row: object): object {
    //[... what to do here ? ]

    return row;
  }

这个函数应该能够接受任何模型/接口的对象

让我们假设我有以下通过函数传递的数据:

  this.data = {
    property1: 1,
    property2: 'prop2',
    property3: 'prop3',
    property4: 'prop4'
  }

我希望上面的“清洁”函数返回以下内容:

  this.data2 = {
    property1: 1,
    property2: 'prop2',
    property3: 'prop3'
  }

换句话说,我想每次都删除 property4 。

但是,我希望 this.data 是不可变的,这意味着我不想覆盖它,但我想返回新模型而不覆盖旧模型(这是我现在的问题,它一直在覆盖它) .

我该怎么做?我尝试使用以下内容:

let data2 = this.data;
delete data2['property4'];
return data2;

但是,它会覆盖 this.data。

谢谢您的帮助!

标签: javascriptangulartypescript

解决方案


简短答案: 浅拷贝对象:

this.dataCopy = {...this.data};

然后,您可以像以前一样删除该属性。

长答案:

分配有非原始值(例如,不是字符串、不是数字、不是符号)的变量被赋予对该值的引用。该引用指向对象在内存中的位置。变量实际上并不包含值。

所以当你在做的时候:

let data2 = this.data;

您正在复制引用(指向对象在内存中存储位置的指针),而不是对象!对 data2 的每次更改都会反映在 this.data 中,因为它们都是指向同一个对象的指针!

在简短的回答中,我说浅拷贝,为什么?浅拷贝,因为它只会复制对象属性,而不是任何嵌套属性。如果您有一个具有嵌套属性的对象,则需要明确声明要复制的嵌套属性或使用其他方法。


推荐阅读