我有一个像这样的数组列表
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
拥有修改后的数组对象
答案 0 :(得分:1)
也许使用myCopiedArray = Array.from(originalArray);
答案 1 :(得分:0)
有两种类型的副本
执行浅层复制时,(i,e)x = y
之类的内容,x和y指向相同的内存位置,因此当您更改x
或y
时,变化将反映在两个变量中。
示例强>
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));
答案 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
它会更好:
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;