将JavaScript中的数组复制到另一个数组时:
var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d'); //Now, arr1 = ['a','b','c','d']
我意识到arr2指的是与arr1相同的数组,而不是一个新的独立数组。如何复制阵列以获得两个独立的阵列?
将JavaScript中的数组复制到另一个数组时:
var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d'); //Now, arr1 = ['a','b','c','d']
我意识到arr2指的是与arr1相同的数组,而不是一个新的独立数组。如何复制阵列以获得两个独立的阵列?
当前回答
重要的
这里的大多数答案适用于特定情况。
如果您不关心深度/嵌套对象和道具,请使用(ES6):
let clonedArray=[…array]
但如果要进行深度克隆,请改用以下方法:
let cloneArray=JSON.parse(JSON.stringify(数组))*
*函数在使用stringify时不会被保存(序列化),如果没有它们,您将得到结果。
对于lodash用户:
let clonedArray=_.clone(数组)文档
and
let cloneArray=_.cloneDeep(数组)文档
其他回答
var arr2=arr1.slice(0);
这种方法只适用于简单数组。
如果您有类似复杂阵列的对象阵列,则必须使用其他解决方案,如:
const arr2 = JSON.parse(JSON.stringify(arr1));
例如,我们有一个对象数组,每个单元格的对象中都有另一个数组字段。。。在这种情况下,如果我们使用切片方法,那么数组字段将通过Ref进行复制,这意味着这些字段更新将影响原始数组中的相同元素和字段。
其中一些方法在处理简单的数据类型(如数字或字符串)时工作得很好,但当数组包含其他对象时,这些方法会失败。当我们试图将任何对象从一个数组传递到另一个数组时,它将作为引用传递,而不是对象。
在JavaScript文件中添加以下代码:
Object.prototype.clone = function() {
var newObj = (this instanceof Array) ? [] : {};
for (i in this) {
if (i == 'clone')
continue;
if (this[i] && typeof this[i] == "object") {
newObj[i] = this[i].clone();
}
else
newObj[i] = this[i]
} return newObj;
};
只需使用
var arr1 = ['val_1','val_2','val_3'];
var arr2 = arr1.clone()
这会奏效的。
还可以使用ES6排列运算符复制阵列
var arr=[2,3,4,5];
var copyArr=[...arr];
这里有一个变体:
var arr1=['a', 'b', 'c'];
var arr2=eval(arr1.toSource());
arr2.push('d');
console.log('arr1: '+arr1+'\narr2: '+arr2);
/*
* arr1: a,b,c
* arr2: a,b,c,d
*/
当有很多答案时,您必须使用最佳实践来解决这个问题。
我建议您使用阵列排列…复制阵列。
var arr1=[‘a’,‘b’,‘c’];
var arr2=[…arr1];