创建新数组而不影响旧数组的值

时间:2013-01-24 10:12:14

标签: javascript

我正在尝试创建现有数组的副本,并从数组副本中删除一些项而不会影响原始数据。我试过这个:

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中的项目被删除。这是一个二维数组。

4 个答案:

答案 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,有关完整说明,请参阅

Creating JavaScript Arrays

答案 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