我正在尝试创建现有数组的副本,并从数组副本中删除一些项而不会影响原始数据。我试过这个:
var new_arr = old_arr; //when I remove from new array the items from old array are also removed
如何创建现有阵列的全新副本?
更新:
当我这样做时:
var new_arr = old_arr.slice();
然后:
new_arr[0].shift();
new_arr[1].shift();
old_array中的项目被删除。这是一个二维数组。
答案 0 :(得分:14)
您可以使用两个方法:
function clone (src) {
return JSON.parse(JSON.stringify(src));
}
或者这个:
var newArray = oldArray.slice();
答案 1 :(得分:2)
使用Yoshi的答案你可以扩展Array原型(只是一个简单的帮手):
Array.prototype.clone = function() {
return this.slice(0);
}
答案 2 :(得分:0)
一种更新的解决方案是像这样使用'from':
const newArr = Array.from(oldArr);
但这是一个浅表副本,如果嵌套元素发生突变,它们将使用from投射到新创建的数组中。最好的解决方案是使用
const newArr = JSON.parse(JSON.stringify(oldArr));
但是该方法不能确保全部。例如,如果数组的某个元素包含n => ++ n之类的函数,则在使用JSON方法后它将为null,因此最佳解决方案是deepClone,有关完整说明,请参阅
答案 3 :(得分:0)
在Javascript中,二维数组只是数组的数组。因此,单维克隆是不够的。我们还需要克隆所有子维度数组。我们的操作方法如下:
function cloneGrid(grid) {
// Clone the 1st dimension (column)
const newGrid = [...grid]
// Clone each row
newGrid.forEach((row, rowIndex) => newGrid[rowIndex] = [...row])
return newGrid
}
// grid is a two-dimensional array
const grid = [[0,1],[1,2]]
newGrid = cloneGrid(grid)
console.log('The original grid', grid)
console.log('Clone of the grid', newGrid)
console.log('They refer to the same object?', grid === newGrid)
---
The original grid [ [ 0, 1 ], [ 1, 2 ] ]
Clone of the grid [ [ 0, 1 ], [ 1, 2 ] ]
They refer to the same object? false
或者,如果我们利用ES6 Array.map操作的优势,我们可以使cloneGrid
的功能更加简单:
const cloneGrid = (grid) => [...grid].map(row => [...row])
有关更多扩展答案,请阅读How to make a copy of an array in JavaScript