将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相同的数组,而不是一个新的独立数组。如何复制阵列以获得两个独立的阵列?
当前回答
var arr2=arr1.slice(0);
这种方法只适用于简单数组。
如果您有类似复杂阵列的对象阵列,则必须使用其他解决方案,如:
const arr2 = JSON.parse(JSON.stringify(arr1));
例如,我们有一个对象数组,每个单元格的对象中都有另一个数组字段。。。在这种情况下,如果我们使用切片方法,那么数组字段将通过Ref进行复制,这意味着这些字段更新将影响原始数组中的相同元素和字段。
其他回答
添加到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]);
同样的事情发生在对象数组中,它们将被引用复制,您必须手动复制它们
这是最新推出的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);
参考:此处
丹,没必要耍花样。你所需要做的就是通过这样做复制arr1。
var arr1=[‘a’,‘b’,‘c’];var arr2=[];var arr2=新数组(arr1);arr2.推送('d');//现在,arr2=[['a','b','c'],d']console.log('arr1:');控制台日志(arr1);console.log('arr2:');控制台日志(arr2);//以下是诀窍:var arr3=[…arr1];arr3.推送('d');//现在,arr3=[‘a’,‘b’,‘c’,‘d’];console.log('arr3:');控制台日志(arr3);
现在arr1和arr2是存储在单独堆栈中的两个不同数组变量。在jsfiddle上看看这个。
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都更好,并且主要用于复制数组。
在研究之后,我发现一个干净的方法可以是:
const arr1 = [['item 1-1', 'item 1-2'], ['item 2-1', 'item 2-2'], ['item 3-1', 'item 3-2']];
/**
* Using Spread operator, it will create a new array with no reference to the first level.
*
* Since, the items are not primitive, they get their own references. It means that any change on them,
* it will be still reflected on the original object (aka arr1).
*/
const arr2 = [...arr1];
/**
* Using Array.prototype.map() in conjunction Array.prototype.slice() will ensure:
* - The first level is not a reference to the original array.
* - In the second level, the items are forced (via slice()) to be created as new ones, so there is not reference to the original items
*/
const arr3 = arr1.map(item => item.slice());
您需要了解要使用的阵列的复杂性,然后应用最佳解决方案(即➡️ 引用数组中的引用项)