push
將資料塞入陣列的最後一筆
1 | var data = ['A', 'B', 'C'] |
pop
將資料最後一筆移除,無參數
1 | var data = ['A', 'B', 'C'] |
unshift
將資料塞入陣列的第一筆
1 | var data = ['B', 'C'] |
shift
將資料第一筆移除,無參數
1 | var data = ['A', 'B', 'C'] |
splice
splice
有兩種不同的用法
移除原始陣列特定索引
帶入一個或兩個參數
splice(指定索引, 欲刪除的數量)
起始索引 - 要從哪個索引開始刪除。
欲刪除的數量 - 從起始索引開始算往後山幾筆資料,若不帶入則從起始索引開始後的所有資料都刪除。
1 | var data = ['A', 'B', 'C', 'D', 'E'] |
1 | var data = ['A', 'B', 'C', 'D', 'E'] |
指定從某個索引塞入資料,並且選擇從該索引往後刪除幾筆資料(或不刪除)
必須帶入三個參數
splice(指定索引, 欲刪除的數量, 欲塞入的資料)
1 | var data = ['A', 'B', 'C', 'D', 'E'] |
slice
slice 與 splice 很像,slice 取得兩個指定索引間的所有資料,且不會改變原始陣列。
slice( 起始索引[包含], 結束索引[不包含] )
1 | arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']; |
若只帶第一個參數則是從該參數開始到最後的值都取出
1 | arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']; |
concat
可以用來合併兩個陣列
1 | arr = ['A', 'B'] |
可以用來複製陣列
1 | arr = ['A', 'B'] |
join
若把陣列轉換為字串就會以逗號作為一個分隔。
1 | arr = ['A', 'B', 'C', 'D'] |
若要移除逗號或是以別的東西代替逗號,就可以使用 join
1 | arr = ['A', 'B', 'C', 'D'] |
reverse
將原始陣列排序相反過來
1 | var data = ['A', 'B', 'C', 'D', 'E'] |
sort
sort() 方法會原地(in place)對一個陣列的所有元素進行排序,並回傳此陣列。預設的排序順序是根據字串的 Unicode 編碼位置(code points)而定。
不帶入函式
1 | var months = ['March', 'Jan', 'Feb', 'Dec']; |
帶入函式 ( 依數字大小排序 )
陣列元素們將根據比較函式之回傳值來排序。如果 a 和 b 為被比較之兩元素,則:
- 若 compare(a, b) 的回傳值小於 0,則 a 排在 b 前面。
- 若 compare(a, b) 的回傳值大於 0,則 b 排在 a 前面。
- 若 compare(a, b) 回傳 0,則 a 與 b 皆不會改變彼此的順序,但會與其他全部的元素比較來排序。
1 | var arr = [1, 3, 5, 10, 7, 6] |
1 | arr.sort(function(a, b) { |
縮寫
升冪
1
2
3
4arr.sort(function(a, b){
return a - b
// output: [1, 3, 5, 6, 7, 10]
})降冪
1
2
3
4arr.sort(function(a, b){
return b - a
// output: [10, 7, 6, 5, 3, 1]
})
三元運算子縮寫
升冪
1
2
3
4arr.sort(function(a, b){
return a > b ? 1 : -1 // 翻譯: 如果a>b就回傳-1,不是就回傳1
// output: [1, 3, 5, 6, 7, 10]
})降冪
1
2
3
4arr.sort(function(a, b){
return a < b ? 1 : -1 // 翻譯: 如果a<b就回傳-1,不是就回傳1
// output: [10, 7, 6, 5, 3, 1]
})
indexOf
用於取的陣列的索引位子,從前面開始找,且找到符合條件的元素後即回傳該元素索引。
下面例子雖然後面還有一個 B 符合條件,但因為前面已經找到了,所以不會在往下找。
1 | arr = ['A', 'B', 'C', 'D', 'E', 'B'] |
在陣列內找不到該值則回傳 -1
1 | arr = ['A', 'B', 'C', 'D', 'E'] |
運用
將兩個陣列不重複的值取出,組成一個新陣列
1 | var arr = ['A', 'B', 'C', 'D', 'E'] |
解答
1 | var newArr = arr.filter((item) => { |
1 | console.log(newArr) |
lastIndexOf
跟 indexOf 太一樣的地方是indexOf 只要 一找到資料就會立刻回傳
,而 lastIndexOf 會找完全部陣列再回傳最後一筆符合條件的資料索引位子。
1 | arr = ['A', 'B', 'A', 'D', 'A'] |
====以下例子會使用這個陣列作範例====
1 | let data = [ |
傳統 for
1 | var len = data.length |
for in
- 此篇只有
for in
可用於物件
1 | for (let index in data) { |
forEach
forEach
沒在return
的,所以寫了也沒用。
1 | data.forEach(function(item, index, arr) { |
filter
filter()
會回傳一個陣列,回傳的是所有判斷為true
的值,很適合用在搜尋所有符合條件的資料。
1 | var filterData = data.filter(function(item, index, arr) { |
find
- 類似
filter()
,但只回傳陣列中第一個為true
的值,適合用在判斷該陣列有沒有任一個符合特定條件目標。
1 | var findData = data.find(function(item, index, arr) { |
map
- 判斷條件為
true
的話,可以return
自定義內容。 - 使用
map()
需要return
一個值,他會透過函式內所回傳的值組合成一個陣列。- 回傳的新陣列長度一定會等於該遍歷資料的長度。
- 如果不回傳任何東西,會形成長度同該遍歷資料的
undefined
陣列。
1 | var mapData = data.map(function(item, index, arr) { |
1 | var mapData = data.map(function(item, index, arr) { |
1 | var mapData = data.map(function(item, index, arr) { |
every
- 檢查陣列值是否符合條件,這僅會回傳一個值
true
或false
,適合用來檢查陣列中的內容是否全部都符合特定條件。
1 | data.every(function(item, index, arr) { |
some
- 和
every()
類似,但只要一個符合就會回傳true
。
1 | data.some(function(item, index, arr) { |
reduce
prev
參數的值為最後帶入的數字 (此例為0)- 下例(1)
prev
初始值是0,跑第二次迴圈時prev
的值變成第一次迴圈所return
的值,依此類推。
1 | /* 加總所有人的錢,reduceData最後結果為3600 */ |
reduceRight
類似於 reduce
,但 reduceRight
的執行順序是由後往前執行。
加總陣列內的數字
如果是加總陣列內的數字,不管是由前往後或是由後往前,結果是看不出差別的。
1 | var arr = [1, 2, 3, 4, 5]; |
reduce
1 | arr.reduce((prev, item) => { |
reduceRight
1 | arr.reduceRight((prev, item) => { |
組字串
如果是組字串就能看出差異
1 | var arr = ['1', '2', '3', '4', '5']; |
reduce
1 | arr.reduce((prev, item) => { |
reduceRight
1 | arr.reduceRight((prev, item) => { |
findIndex
1 | var arr = [5, 12, 8, 130, 44]; |
其他
預設的陣列行為內的 this 是指向 window (本篇中除了 reduce() 是傳入初始資料),如果要改,可以在 function 後傳入。
1 | let newArr = ['A', 'B','C'] |
1 | var newData = data.forEach(function(item, index, arr){ |
參考資料
陣列取出重覆與不重複值˙的方法
[偷米騎巴哥]操作JS陣列的20種方式
[偷米騎巴哥]操作JS陣列的20種方式 - 筆記整理
hsiangfeng - 關於JS陣列20種操作的方法