我正在构建简单的备份/撤消功能,无法正确克隆阵列以进入备份。我尝试使用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, …}
我做错了什么? 非常感谢你的帮助。
答案 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));
请注意,在此示例中未克隆数组中的字符串元素,因此字符串很好,但对象仍可能遇到问题,因为它会保留相同的引用。