關於陣列的拷貝
關於陣列的拷貝可以分為淺拷貝與深拷貝
- 淺拷貝: 淺拷貝可以完全複製一維陣列中的字串、數值..等等的資料。但如果有包含巢狀的資料,如物件、陣列、函式等等…,就無法複製。
- 深拷貝: 可以無視一維或巢狀資料,完全複製一個一模一樣的陣列。
一、淺拷貝 (shadow copy) 的方法
1. 使用展開 (spread) 運算子
使用展開運算子將陣列分解,然後重組的特行進行淺拷貝1
2
3
4
5
6let array = ['a','b','c']
let newArray = [...array]
newArray.push('d')
console.log(array) // ["a", "b", "c"]
console.log(newArray) // ["a", "b", "c", "d"]2. 使用 slice
slice 原本用於將陣列分隔出來使用,但如果 slice 後的參數為 0 或不加參數,就可做淺拷貝使用。1
2
3
4
5
6let array = ['a','b','c']
let newArray = array.slice(0) // or let newArray = array.slice()
newArray.push('d')
console.log(array) // ["a", "b", "c"]
console.log(newArray) // ["a", "b", "c", "d"]
3. 使用 concat
concat 原本使用在合併陣列,這邊可以使用一個空陣列合併要被複製的陣列達成淺拷貝的功能。
1 | let array = ['a','b','c'] |
4. 使用 for 迴圈
利用 for 迴圈一一將陣列資料擺進去
1 | let array = ['a','b','c'] |
5. 使用 for in 淺拷貝物件
注意,這邊說的是物件 {}
類似 forEach 的語法,但只能用在物件上,可以將 key 值拉出來,更具彈性。
1 | let object = { |
6. 使用 Object.assign 來複製物件
注意,這邊說的是物件 {}
1 | let object = { father: 'Mike' } |
二、深拷貝 (deep copy) 的方法
1. 使用 JSON.parse(JSON.stringtify(陣列)) 來實踐。
透過 JSON.stringify 將陣列轉換成 JSON 的字串,再透過 JSON.parse 轉換為物件
1 | let array = [ |
但 JSON 的方法只限用於資料為單純的數值、字串,如果資料內有函式、map、set 就無效了。
2. 完全的深拷貝,使用 JQuery
$.extend(true ,{}, obj)
true : 使否使用深拷貝,如果沒有寫就是淺拷貝
{} : 空的物件,放入拷貝的物件
obj : 將被深拷貝的物件
1 | let obj = {name: '天天', age(){console.log('24 歲')}} |
3. 完全的深拷貝,使用 ladash libary
事前要先載入 ladash libary
1 | let obj = {name: '天天', age(){console.log('24 歲')}} |
使用 jQuery 和 ladash 的方法,就連函式也能複製出來。