将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与spread Opartor一起使用,它更简单。
arr2 = [...arr1];
有一些限制。。check docs Spread语法@mozilla
其他回答
只是在写:
arr2 = arr1.concat();
您正在使用第一个数组的副本生成新数组。请注意,这是将元素推入数组的一种功能方式。
如果您的代码基于ES6,您也可以使用扩展运算符:
arr2 = [...arr1];
这是最新推出的Array.from,但不幸的是,截至本文撰写之时,它仅在最新的Firefox版本(32及更高版本)上受支持。它可以简单地使用如下:
var arr1 = [1, 2, 3];
console.log(Array.from(arr1)); // Logs: [1, 2, 3]
参考:此处
或者Array.prototype.map可以与标识函数一起使用:
function identity(param)
{
return param;
}
var arr1 = [1, 2, 3],
clone = arr1.map(identity);
参考:此处
let a = [1,2,3];
现在,您可以执行以下任一操作来创建阵列的副本。
let b = Array.from(a);
OR
let b = [...a];
OR
let b = new Array(...a);
OR
let b = a.slice();
OR
let b = a.map(e => e);
现在,如果我改变一个,
a.push(5);
那么,a是[1,2,3,5],但b仍然是[1,3,3],因为它有不同的引用。
但我认为,在上述所有方法中,Array.from都更好,并且主要用于复制数组。
切片的另一种选择是凹面,可以用两种方式。第一个可能更容易理解,因为预期行为非常清楚:
var array2 = [].concat(array1);
第二种方法是:
var array2 = array1.concat();
科恩(在评论中)指出,后一种方法具有更好的性能。
其工作方式是concat方法创建一个新数组,该数组由调用它的对象中的元素组成,后跟作为参数传递给它的任何数组的元素。因此,当没有传递参数时,它只是复制数组。
Lee Penkman也在评论中指出,如果array1有可能未定义,可以返回一个空数组,如下所示:
var array2 = [].concat(array1 || []);
或者,对于第二种方法:
var array2 = (array1 || []).concat();
请注意,您也可以使用slice:var array2=(array1||[]).slice();执行此操作;。
如果要创建对象或数组的新副本,必须显式复制对象或数组元素的财产,例如:
var arr1 = ['a','b','c'];
var arr2 = [];
for (var i=0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
您可以在Google上搜索有关不可变原始值和可变对象引用的更多信息。