【问题标题】:Remove a specific known property from an unknown dynamic object [duplicate]从未知动态对象中删除特定的已知属性[重复]
【发布时间】:2021-01-09 22:38:06
【问题描述】:

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

  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。

感谢您的帮助!

【问题讨论】:

  • 让 data2 = {...this.data}
  • 就这么简单:const filterObject = (obj, trashPropName) => {const {[trashPropName]: trash, ...rest} = obj; return rest}

标签: javascript angular typescript


【解决方案1】:

简答: 浅拷贝对象:

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

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

长答案:

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

所以当你在做的时候:

let data2 = this.data;

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

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

【讨论】:

  • 谢谢,这很有意义。
猜你喜欢
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2018-10-03
相关资源
最近更新 更多