Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用切片的数组复制无效_Javascript_Arrays - Fatal编程技术网

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())