JavaScript 提供了多種新增,移除,替換陣列元素的方法,但是有些會影響原來的陣列;有些則不會,它是新建了一個陣列。
注意:區分以下兩個方法的不同點:
array.splice()
影響原來的陣列array.slice()
不影響原來的陣列
I. 新增:影響原陣列
使用 array.push()
和 array.ushift()
新增元素會影響原來的陣列。
1 2 3 |
let mutatingAdd = ['a', 'b', 'c', 'd', 'e']; mutatingAdd.push('f'); // ['a', 'b', 'c', 'd', 'e', 'f'] mutatingAdd.unshift('z'); // ['z', 'b', 'c', 'd', 'e' 'f'] |
II. 新增:不影響原陣列
兩種方式新增元素不會影響原陣列,第一種是 array.concat()
。
1 2 3 |
const arr1 = ['a', 'b', 'c', 'd', 'e']; const arr2 = arr1.concat('f'); // ['a', 'b', 'c', 'd', 'e', 'f'] (注:原文有誤,我做了修改 “.” ---> “,”) console.log(arr1); // ['a', 'b', 'c', 'd', 'e'] |
第二種方法是使用 JavaScript 的展開(spread)操作符,展開操作符是三個點(…)
1 2 3 |
const arr1 = ['a', 'b', 'c', 'd', 'e']; const arr2 = [...arr1, 'f']; // ['a', 'b', 'c', 'd', 'e', 'f'] const arr3 = ['z', ...arr1]; // ['z', 'a', 'b', 'c', 'd', 'e'] |
展開操作符會複製原來的陣列,從原陣列取出所有元素,然後存入新的環境。
III. 移除:影響原陣列
使用 array.pop()
和 array.shift()
移除陣列元素時,會影響原來的陣列。
1 2 3 |
let mutatingRemove = ['a', 'b', 'c', 'd', 'e']; mutatingRemove.pop(); // ['a', 'b', 'c', 'd'] mutatingRemove.shift(); // ['b', 'c', 'd'] |
array.pop()
和 array.shift()
返回被移除的元素,你可以通過一個變數獲取被移除的元素。
1 2 3 4 5 6 7 |
let mutatingRemove = ['a', 'b', 'c', 'd', 'e']; const returnedValue1 = mutatingRemove.pop(); console.log(mutatingRemove); // ['a', 'b', 'c', 'd'] console.log(returnedValue1); // 'e' const returnedValue2 = mutatingRemove.shift(); console.log(mutatingRemove); // ['b', 'c', 'd'] console.log(returnedValue2); // 'a' |
array.splice()
也可以刪除陣列的元素。
1 2 |
let mutatingRemove = ['a', 'b', 'c', 'd', 'e']; mutatingRemove.splice(0, 2); // ['c', 'd', 'e'] |
像 array.pop()
和 array.shift()
一樣,array.splice()
同樣返回移除的元素。
1 2 3 4 |
let mutatingRemove = ['a', 'b', 'c', 'd', 'e']; let returnedItems = mutatingRemove.splice(0, 2); console.log(mutatingRemove); // ['c', 'd', 'e'] console.log(returnedItems) // ['a', 'b'] |
IV. 移除:不影響原陣列
JavaScript 的 array.filter()
方法基於原陣列建立一個新陣列,新陣列僅包含匹配特定條件的元素。
1 2 3 4 5 6 |
const arr1 = ['a', 'b', 'c', 'd', 'e']; const arr2 = arr1.filter(a => a !== 'e'); // ['a', 'b', 'c', 'd'](注:原文有誤,我做了修改) // 或者 const arr2 = arr1.filter(a => { return a !== 'e'; }); // ['a', 'b', 'c', 'd'](注:原文有誤,我做了修改) |
以上程式碼的條件是“不等於 ‘e’ ”,因此新陣列(arr2
)裡面沒有包含 ‘e’。
箭頭函式的獨特性:
單行箭頭函式,’return’ 關鍵字是預設自帶的,不需要手動書寫。
可是,多行箭頭函式就需要明確地返回一個值。
另一種不影響原陣列的方式是 array.slice()
(不要與 array.splice()
混淆)。
1 2 3 |
const arr1 = ['a', 'b', 'c', 'd', 'e']; const arr2 = arr1.slice(1, 5) // ['b', 'c', 'd', 'e'] const arr3 = arr1.slice(2) // ['c', 'd', 'e'] |
V. 替換:影響原陣列
如果知道替換哪一個元素,可以使用 array.splice()
。
1 2 3 4 |
let mutatingReplace = ['a', 'b', 'c', 'd', 'e']; mutatingReplace.splice(2, 1, 30); // ['a', 'b', 30, 'd', 'e'] // 或者 mutatingReplace.splice(2, 1, 30, 31); // ['a', 'b', 30, 31, 'd', 'e'] |
VI. 替換:不影響原陣列
可以使用 array.map()
建立一個新陣列,並且可以檢查每一個元素,根據特定的條件替換它們。
1 2 3 4 5 6 7 |
const arr1 = ['a', 'b', 'c', 'd', 'e'] const arr2 = arr1.map(item => { if(item === 'c') { item = 'CAT'; } return item; }); // ['a', 'b', 'CAT', 'd', 'e'] |
使用 array.map()
轉換資料
array.map()
是個強力方法,可以用於轉換資料,而不汙染原先的資料來源。
1 2 3 |
const origArr = ['a', 'b', 'c', 'd', 'e']; const transformedArr = origArr.map(n => n + 'Hi!'); // ['aHi!', 'bHi!', 'cHi!', 'dHi!', 'eHi!'] console.log(origArr); // ['a', 'b', 'c', 'd', 'e']; // 原陣列毫髮無損 |
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式