使用切片的数组副本不起作用



我希望在使用 distances.slice()之后,我会拥有一个数组的副本。但是,当我更改新副本的元素时,它仍然会更改原始数组。为什么?

var distances = [
  ['-1', '10', '-1', '31'],
  ['10', '-1', '10', '-1'],
  ['-1', '-1', '-1', '10'],
  ['15', '6', '-1', '-1']
];
for (var i = 0; i < 4; i++) {
  console.log(distances, 'distances pairstop');
  var sampleDistance = distances.slice()
  sampleDistance[0][2] = ['fooo']
}

切片产生数组的副本。它在文档中说:

slice((方法返回一部分数组的浅副本 进入一个新的数组对象,从头到尾选择(不包括结束(。 原始数组将不会被修改。

由于distances是Arryas的数组,因此sampleDistance将是浅副本,这意味着它将参考到相同的3(一维(数组。 sampleDistance[0][2] = ['fooo']更改了第一个一维数组,该数组均由sampleDistancedistances引用。

因此您的错误。

用不确定深度的子数组项克隆一个数组,您需要一个通用数组克隆工具,例如;

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};

所以distances.clone()应该可以做好工作。