复制数组列表对象后,是否自动复制修改后的原始数组列表?

时间:2018-03-27 09:21:59

标签: angular typescript

我有一个像这样的数组列表

private options: Array<any> = [];
private optionsListDuplicate: Array<any> = [];

let data=[{id:"id",name :"name"},{id:"id2",name:"name"}];

for(let i=0;i<data.length;i++){
    this.options.push({
        label:data[i].name,
        value:data[i].id
    });
    this.optionsListDuplicate.push({
        label:data[i].name,
        value:data[i].id
    });
}

但是当我修改options数组对象时,它也会修改optionsListDuplicate对象。请帮助我理解为什么会这样。

我正在向现有选项对象添加一个新列表,如此

this.options.push({
            label:"somelabel",
            value:"someid"
        });

我要求我需要保留原始对象。所以我做了这个

this.options=this.optionsListDuplicate;

但是this.optionsListDuplicate拥有修改后的数组对象

3 个答案:

答案 0 :(得分:1)

也许使用myCopiedArray = Array.from(originalArray);

答案 1 :(得分:0)

有两种类型的副本

  • 浅拷贝
  • 深层复制

执行浅层复制时,(i,e)x = y之类的内容,x和y指向相同的内存位置,因此当您更改xy时,变化将反映在两个变量中。

示例

let x = [1, 2, 3]
let y = x;
let z = x.slice(); // or JSON.parse(JSON.stringify(x));

x.push(4);

console.log(y); // prints [1, 2, 3, 4]
console.log(z); // prints [1, 2, 3]

要执行深层复制,您可以在数组的情况下使用splice方法,或者在对象的情况下使用JSON.parse(JSON.stringify(x))

执行深层复制时,一个变量的更改不会影响其他变量。

  

但是当我修改options数组对象时,它也在修改optionsListDuplicate对象

在您的情况下,您可能正在使用以下某处

this.optionsListDuplicate = this.options;

将其更改为

this.optionsListDuplicate = this.options.slice();
// or..
this.optionsListDuplicate = JSON.parse(JSON.stringify(this.options));

Stackblitz

答案 2 :(得分:0)

好吧,如果你将一个数组分配给另一个,那么当然你修改一个数组时,你会修改另一个。

当你这样做时

this.options = this.optionsListDuplicate;

没有复制数组,只是创建一个指向它的新变量。实际上,通过执行此操作,this.optionsListDuplicate指向的旧数组将丢失。我建议您阅读JavaScript中的参考和值类型:Primitive value vs Reference value

如果你想保留原始数组,那么你必须这样做:

this.optionsListDuplicate = this.options.slice();

因为,通过您的代码(您要将元素添加到this.options),我知道您希望this.optionsListDuplicate成为原作&#39;阵列。

当然,现在您不需要在for语句中初始化两个数组。事实上,你不需要for来做任何事情,如果你使用map它会更好:

&#13;
&#13;
private options: Array<any>;
private optionsListDuplicate;

let data=[{id:"id",name :"name"},{id:"id2",name:"name"}];

this.options = data.map(item => { label: item.name, value: item.id });
this.optionsListDuplicate = this.options.slice();
&#13;
&#13;
&#13;