Javascript 使用切片的数组复制无效
我希望在使用Javascript 使用切片的数组复制无效,javascript,arrays,Javascript,Arrays,我希望在使用distance.slice()之后,我会有一个数组的副本。但当我更改新副本的元素时,它仍然会更改原始数组。为什么? var距离=[ ['-1', '10', '-1', '31'], ['10', '-1', '10', '-1'], ['-1', '-1', '-1', '10'], ['15', '6', '-1', '-1'] ]; 对于(变量i=0;ix.slice())
distance.slice()
之后,我会有一个数组的副本。但当我更改新副本的元素时,它仍然会更改原始数组。为什么?
var距离=[
['-1', '10', '-1', '31'],
['10', '-1', '10', '-1'],
['-1', '-1', '-1', '10'],
['15', '6', '-1', '-1']
];
对于(变量i=0;i<4;i++){
console.log(距离,'distance pairstop');
var sampleDistance=距离。slice()
样本距离[0][2]=['fooo']
}
切片生成数组的浅拷贝。
它是这样写的:
slice()方法返回数组一部分的浅拷贝
插入从开始到结束(不包括结束)选择的新阵列对象。
原始数组将不会被修改
由于distance
是一个arrya数组,sampleDistance
将是一个浅拷贝,这意味着它将包含对相同3(一维)数组的引用。
sampleDistance[0][2]=['fooo']
更改第一个一维数组,该数组由sampleDistance
和distance
引用
这就是你的错误。要克隆具有无限深度子数组项的数组,你需要一个通用的数组克隆工具,如
Array.prototype.clone = function(){
return this.map(e => Array.isArray(e) ? e.clone() : e);
};
所以
distance.clone()
应该可以很好地完成这项工作。slice
只做浅拷贝要实现深拷贝,可以使用var-sampleDistance=distance.map(x=>x.slice())