使用切片的数组复制不起作用

时间:2017-04-30 13:30:02

标签: javascript arrays

我希望在使用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']
}

2 个答案:

答案 0 :(得分:2)

切片生成数组的副本。 它在docs

中这样说
  

slice()方法返回数组部分的浅表副本   到从开始到结束选择的新数组对象(不包括结束)。   原始数组不会被修改。

由于distances是一个arryas数组,sampleDistance将是一个浅表副本,这意味着它将保持对相同的3(一维)数组的引用。 sampleDistance[0][2] = ['fooo']更改了第一个一维数组,该数组由sampleDistancedistances引用。

因此你的错误。

答案 1 :(得分:0)

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

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

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