如何克隆多维数组?

时间:2017-09-03 15:28:36

标签: javascript arrays multidimensional-array clone

我正在构建简单的备份/撤消功能,无法正确克隆阵列以进入备份。我尝试使用slice()和递归函数来“深度克隆”,但是克隆的数组仍然是最新状态的副本,或者它没有克隆数组的所有元素。

我正在使用Babel。

constructor(config) {
  this.all = [];
  this.all.colors = [5,7];
  this.all.sprites = [];
  this.all.current_sprite = 0;
  this.all.width = config.sprite_x;
  this.all.height = config.sprite_y;
  this.backup = [];
  this.backup_position = 0;     
}

版本1深度克隆(不起作用)

save_backup() {
  this.backup.push(this.deepClone(this.all));
  this.backup_position ++;
  console.log(this.backup);
}

deepClone(arr) {
  var len = arr.length;
  var newArr = new Array(len);
  for (var i=0; i<len; i++) {
    if (Array.isArray(arr[i])) {
      newArr[i] = deepClone(arr[i]);
    } else {
      newArr[i] = arr[i];
    }
  }
  return newArr;
}

版本2 slice()(不起作用)。

save_backup() {
  this.backup.push(this.all.slice());
  this.backup_position ++;
  console.log(this.backup);
}

数组包含各种数据:整数,数组,对象,如

colors : (2) [5, 7]
config : {setting: "c64", sprite_x: 24, sprite_y: 21, colors: Array(16), zoom: 20, …}

我做错了什么? 非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用Array.map和Array扩展运算符来克隆2D数组,如下所示:

const arr1 = [
  [ 'a', 'b' ],
  [ 'r', 's' ]
];

function clone2D(a) {
  return a.map(o => [...o]);
}

const arr2 = clone2D(arr1);

arr2.push(['z']); // add el to outer
arr2[0].push('q');// add el to inner

console.log(JSON.stringify(arr1));
console.log(JSON.stringify(arr2));

请注意,在此示例中未克隆数组中的字符串元素,因此字符串很好,但对象仍可能遇到问题,因为它会保留相同的引用。