這兩天遇到了一個(gè)問題盆繁,如何復(fù)制數(shù)組细诸,所以就從各個(gè)地方找了很多的解決辦法倒庵。算是整理一下绿贞,這樣以便于自己以后的學(xué)習(xí):
【TOC】目錄
- 淺拷貝數(shù)組
- 深拷貝數(shù)組
- 1.使用數(shù)組遍歷賦值
- 原理
- 代碼實(shí)現(xiàn)
- 2.返回新數(shù)組方法
- 2.1 使用slice方法
- 原理
- 代碼實(shí)現(xiàn)
- 2.2 使用數(shù)組map方法
- 2.3 使用concat方法
- 2.1 使用slice方法
- 3.ES6語法實(shí)現(xiàn)深拷貝
- 4.for-in連原型鏈也一并復(fù)制的方法
- 5.多維數(shù)組的復(fù)制
- 1.使用數(shù)組遍歷賦值
淺拷貝數(shù)組
首先第一個(gè)復(fù)制數(shù)組我們都想到的是定義一個(gè)數(shù)組直接相等就可以了:
var arr1 = [1,2,3];
var arr2 = arr1;
arr1[0] = 2;
console.log(arr1[0]); //2
出現(xiàn)這個(gè)的原因就是因?yàn)橐蚩椋瑪?shù)組是用堆去保存的,所以這個(gè)算是淺拷貝籍铁,相等的時(shí)候只是把存放的地址拷貝過去了涡上,兩個(gè)指向了同一個(gè)地址,所以在改變其中一個(gè)的值拒名,其他的也跟著改變了吩愧。
所以如何深拷貝一個(gè)數(shù)組呢?
深拷貝數(shù)組
1.使用數(shù)組遍歷賦值
原理
這個(gè)是最原始的辦法增显,就是把每個(gè)值取出來到另一個(gè)數(shù)組中雁佳。
代碼實(shí)現(xiàn)
var arr1 = [1,2,3];
var arr2 = [];
arr1.forEach(function(value,index){
arr2[index] = value;
})
console.log(arr2);
//這個(gè)時(shí)候改變arr1[0] = 3;那么輸出arr2[0]還是等于1
2. 返回新數(shù)組方法
2.1 使用slice方法
原理
數(shù)組的slice方法是截取數(shù)組的意思,在之前的數(shù)組總結(jié)中也有提過同云。
slice(0)指的是從0開始到末尾截取數(shù)組甘穿,然后返回一個(gè)新的數(shù)組,這樣就不會(huì)影響到原來的數(shù)組了梢杭。
代碼實(shí)現(xiàn)
var arr1 = [1,2,3];
var arr2 = arr1.slice(0);
console.log(arr2); //[1,2,3]
//這個(gè)時(shí)候改變arr1[2] = 5,那么輸出arr2[2]還是等于3
順著這種方法是不是得到了思維的開闊,來看看還有哪些是返回新數(shù)組的秸滴?
2.2使用數(shù)組map方法
使用map方法遍歷數(shù)組然后返回新的數(shù)組武契,里面的值不變
var arr1 = [2,3,4];
var arr2 = arr1.map(function(value){
return value;
})
console.log(arr2); //[2,3,4]
2.3使用concat方法
連接數(shù)組,如果連接的是一個(gè)空荡含,那么也是返回了新的本身的數(shù)組
var arr1 = [3,4,5];
var arr2 = arr1.concat();
console.log(arr2); //[3,4,5]
3.ES6語法實(shí)現(xiàn)深拷貝
ES6擴(kuò)展運(yùn)算符實(shí)現(xiàn)數(shù)組的深拷貝咒唆,目前是最簡(jiǎn)單的。
var arr = [1,2,3,4,5];
var [ ... arr2 ] = arr;
console.log(arr); //[1,2,3,4,5]
console.log(arr2); //[1,2,3,4,5]
4.for-in連原型鏈也一并復(fù)制的方法
這種辦法释液,不僅復(fù)制的值全释,還會(huì)把屬性也進(jìn)行拷貝。
var arr = [1,2,3,4,5];
arr.prototype = 5;
var arr2 = [];
for(var a in arr){
arr2[a] = arr[a];
}
console.log(arr2); // [1,2,3,4,5]
console.log(arr2.prototype); // 5
//之前的方法中新數(shù)組的prototype都是undefined
5.多維數(shù)組的復(fù)制
原理
多維數(shù)組轉(zhuǎn)化為字符串會(huì)成為一維數(shù)組误债。
var arr = [[1,2],3,4,[5,6]];
var arr1 = arr.toString().split(",")
var arr2 = arr.join().split(",")
console.log(arr1) //[1,2,3,4,5,6]
console.log(arr2) //[1,2,3,4,5,6]
但是怎么可以保持那種二維數(shù)組的狀態(tài)呢浸船?需要下面的代碼
代碼實(shí)現(xiàn)
var arr = [[1,2],3,4,[5,6]];
var arr3 = JSON.parse(JSON.stringify(arr));
console.log(arr3) // [[1,2],3,4,[5,6]]
如果你有新的方法歡迎留言?如果我找到新的方法會(huì)不定期更新...
?burning_韻七七