将JavaScript中的数组复制到另一个数组时:

var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d');  //Now, arr1 = ['a','b','c','d']

我意识到arr2指的是与arr1相同的数组,而不是一个新的独立数组。如何复制阵列以获得两个独立的阵列?


当前回答

以下是其他几种复制方法:

常量数组=[1,2,3,4];const arrayCopy1=对象.值(数组);const arrayCopy2=对象赋值([],数组);const arrayCopy 3=array.map(i=>i);const arrayCopy4=数组.of(…Array);

其他回答

添加到array.slice()的解决方案中;请注意,如果您有多维数组,子数组将被引用复制。您可以做的是分别循环和切片()每个子数组

var arr = [[1,1,1],[2,2,2],[3,3,3]];
var arr2 = arr.slice();

arr2[0][1] = 55;
console.log(arr2[0][1]);
console.log(arr[0][1]);

function arrCpy(arrSrc, arrDis){
 for(elm in arrSrc){
  arrDis.push(arrSrc[elm].slice());
}
}

var arr3=[];
arrCpy(arr,arr3);

arr3[1][1] = 77;

console.log(arr3[1][1]);
console.log(arr[1][1]);

同样的事情发生在对象数组中,它们将被引用复制,您必须手动复制它们

不需要jQuery。。。工作示例

var arr2 = arr1.slice()

这将从起始位置0到阵列末端复制阵列。

重要的是要注意,它将按照原始类型(字符串、数字等)的预期工作,并解释引用类型的预期行为。。。

如果您有一个引用类型数组,那么就说Object类型。将复制该数组,但这两个数组都将包含对同一对象的引用。因此,在这种情况下,即使实际复制了数组,也似乎通过引用复制了数组。

重要的

这里的大多数答案适用于特定情况。

如果您不关心深度/嵌套对象和道具,请使用(ES6):

let clonedArray=[…array]

但如果要进行深度克隆,请改用以下方法:

let cloneArray=JSON.parse(JSON.stringify(数组))*

*函数在使用stringify时不会被保存(序列化),如果没有它们,您将得到结果。


对于lodash用户:

let clonedArray=_.clone(数组)文档

and

let cloneArray=_.cloneDeep(数组)文档

这是我在尝试了许多方法之后所做的:

var newArray = JSON.parse(JSON.stringify(orgArray));

这将创建一个与第一个副本无关的新深度副本(而不是浅层副本)。

此外,这显然不会克隆事件和函数,但您可以在一行中完成它,并且它可以用于任何类型的对象(数组、字符串、数字、对象…)

以下是其他几种复制方法:

常量数组=[1,2,3,4];const arrayCopy1=对象.值(数组);const arrayCopy2=对象赋值([],数组);const arrayCopy 3=array.map(i=>i);const arrayCopy4=数组.of(…Array);