角2打字稿:concat()可变

时间:2018-10-08 09:08:13

标签: javascript angular typescript

我要在提供程序 @Injectable 上声明一个数组,以在不同组件中使用它。

  normeList: any[] = [
    {
      name: 'choice 1',
      type:'false'
    },
    {
      name: 'choice 2',
      type:'false'
    }
  ];

在组件上,我这样分配了该数组:

this.myArray = [].concat(this.sharedListDeclarationProvider.normeList);

在视图上,我正在使用myArray,并且正在将type上的myArray从false更改为true;

问题在于组件上的'myArray'和提供程序上声明的normList也在更改。

如何在不更改myArray的情况下更改normeList的值

2 个答案:

答案 0 :(得分:1)

您可以使用 JSON.parse JSON.stringify

this.myArray = JSON.parse(JSON.stringify((this.sharedListDeclarationProvider.normeList));

答案 1 :(得分:1)

我想您想从提供者那里克隆normeList数组,并在您的组件中使用它。

如果要复制数组而没有突变或没有副作用,则可以使用slice数组方法,但这仅适用于简单数组。对于复杂的数组,您可以使用

  • JSON.parse(JSON.stringify(array))
  • 使用传播运算符[... array]的
  • ES6版本 连同地图
  • mapObject.assign组合使用

因此,您可以重写以下行

this.myArray = [].concat(this.sharedListDeclarationProvider.normeList); 

使用

this.myArray = this.sharedListDeclarationProvider.normeList.map(item=>Object.assign({}, item));

甚至使用ES6传播算子更短

this.myArray = this.sharedListDeclarationProvider.normeList.map(item=>{}..item));