[JavaScript] Array
前言
JavaScript 的陣列可以看作是一種特別的「物件」,透過 typeof會返回陣列的類型是object。陣列是一組按次序排列的值, 放在裡面的東西稱為元素,每個元素都有其位置,稱為索引,找到索引值,就可以得知該位置元素的值。
- 陣列只能透過 [] 來存取
- 索引值從0開始排序,最後一個索引值為 array.length-1
陣列內可以是原始的資料類型、其他陣列、函式等等。
建立陣列的方式:
使用中括號[]
1 |
|
透過 new 關鍵字來建立
1 |
|
判斷陣列
使用Array.isArray( )函式,依回傳true或false來判斷該物件是否為陣列
1 |
|
陣列的存取
稱作陣列實字(Array literal)
1 |
|
陣列與字串的比較:
1 |
|
字串在JavaScript中似陣列,每個元素都可視為字元,所以能用中括號[ ],透過索引值來讀取字串,但實際類型依舊是string,而不是陣列。
陣列方法(method)
排序
sort( )
陣列中sort( )方法,會先將元素轉字串,再依據字串的Unicode編碼進行排序,會改變原陣列。預設以字串形式去比較(首字比較), 大寫排在前面 ,如果想不區分大小寫排序,可使用toLowerCase( )方法。
1 |
|
若以數字方式去做sort( )排序,會得出非預期的結果
1 |
|
解決方式: 使用一個比較的函式做為引數,來判斷元素的大小與排列順序
1 |
|
特殊排序處理
採parseInt()
1 |
|
亂數排序的陣列
採Math.random()
1 |
|
將陣列中元素的排列順序倒轉過來
採reverse()
1 |
|
indexOf()
indexOf(searchValue,fromIndex)
searchValue: 檢索字串值(必填)
fromIndex: 起始位置(選填) 默認值為: 0
搜尋陣列中是否有符合給定值的元素,若有,就回傳第一個符合元素的索引值;若無,回傳-1。
1
2
3
4var str4 = 'hello world!!!' // 空格也須算入
console.log(str4.indexOf('o')); // 查找 'o' 首次出現的位置 // 4
console.log(str4.indexOf('o',5)); // 從第"5"個元素開始查找 'o' 首次出現的位置 // 7
console.log(str4.indexOf('!!')); // 檢索多個字串 // 11
陣列的尾端添加一個或多個元素,並返回添加新元素後的陣列長度
push()
方法,push()會改變原陣列
1 |
|
刪除陣列的最後一個元素,並返回該元素。
pop()
方法
1 |
|
對空陣列使用pop()方法,不會報錯,而是返回undefined。
1 |
|
刪除陣列的第一個元素,並返回該元素。
shift()
方法
1 |
|
用於在陣列的第一個位置添加元素,並回傳添加新元素後的陣列長度, 可以接受多個參數。
unshift()
方法
1 |
|
分割
join()
‘方法,( )內的參數表分割符號。若無參數,則以 ,
做分割符號,並且轉為string
1 |
|
如果陣列元素是undefined或null或空值,會被轉成空字串。
1 |
|
提取目標陣列的一部分, 回傳一個新陣列,原陣列不變
slice()
- arr.slice(start, end);
1
2
3
4
5
6
7var a = ["a", "b", "c"];
console.log( a.slice(0)); // ["a", "b", "c"]
console.log( a.slice(1)); // ["b", "c"]
console.log(a.slice(1, 2)); // ["b"]
console.log(a.slice(2, 6)); // ["c"]
console.log(a.slice());// ["a", "b", "c"] // 返回原陣列
上面例子,slice()
第一個參數為起始位置(從0開始),第二個參數為終止位置(但該位置的元素本身不包括在內)。如果省略第二個參數,則回傳到原陣列的最後一個元素。
如果slice()的參數是負數,則表示倒數的位置,例: -1表示從倒數第一個元素開始
1 |
|
如果第一個參數大於等於陣列長度,或者第二個參數小於第一個參數,則回傳空陣列。
1 |
|
字串的分割,並回傳陣列。
split()
方法
split(sep,lenght)
sep做分割符; length: 指定回傳陣列最大長度
1 |
|
顛倒字串方法
- 轉為陣列 : 用 split(‘’)
- 陣列反轉
- 拼接成字符串 : 可用join(‘’)
1
2var str1 = '123456'
alert(str1.split('').reverse().join(''))
刪除原陣列的一部分元素
splice()
方法,並可以在刪除的位置添加新的陣列元素, 回傳值是被刪除的元素,splice()
會改變原陣列。
arr.splice(start, count, addElement1, addElement2, ...);
第一個參數是刪除的起始位置(從0開始),第二個參數是被刪除的元素個數。如果後面還有更多的參數,則表示這些就是要被插入陣列的新元素。
- 從原陣列4號位置開始,刪除了兩個陣列元素。
1
2
3
4var a = ["a", "b", "c", "d", "e", "f"];
console.log(a.splice(4, 2)); // ["e", "f"]
console.log(a); // ["a", "b", "c", "d"] - 除了刪除元素,還插入了兩個新元素。
1
2
3
4var a = ["a", "b", "c", "d", "e", "f"];
console.log(a.splice(4, 2, 1, 2)); // ["e", "f"] // 回傳被刪除的元素
console.log(a); // ["a", "b", "c", "d", 1, 2]起始位置如果是負數,就表示從倒數位置開始刪除。
1
2
3var a = ['a', 'b', 'c', 'd', 'e', 'f'];
console.log(a.splice(-4, 2)) // ["c", "d"]
// 從倒數第四個位置c開始刪除兩個元素。如果只是單純地插入元素,splice()的第二個參數可以設為0。
1
2
3
4
5
6
7
8
9var a = [1, 1, 1];
console.log(a.splice(1, 0, 2)) // []
console.log(a) // [1, 2, 1, 1]
```
> 如果只提供第一個參數,等同於將原陣列在指定位置拆分成兩個陣列。
```javascript
var a = [1, 2, 3, 4];
console.log(a.splice(2)) // [3, 4]
console.log(a) // [1, 2]
陣列的所有元素依次傳入參數函數
map()
方法,回傳每一次的執行結果組成一個新陣列。
1 |
|
forEach()
forEach()與map()很相似,也是對陣列的所有元素依次執行參數函數。但是,forEach方法不回傳值,只用來操作元素。
forEach的用法與map方法一致,參數是一個函數,該函數同樣接受三個參數:當前值(Value)、當前位置(Index)、整個陣列(Array)。
1 |
|
forEach()無法中斷執行,會將所有元素都跑完。如果希望符合某種條件時就中斷遍歷,要使用for循環。
1 |
|
forEach()不會跳過undefined和null,但會跳過空位。
1 |
|
map( )和forEach()差異:
map( )對執行參數函數方式跟forEach()一樣,差別在於map( )會回傳新陣列,不會修改原陣列。
如果陣列遍歷的目的是為了得到回傳值,那麼使用map(),否則使用forEach()。
filter()
filter()用於過濾陣列元素, 將元素依序傳入回傳的函數中, 回傳滿足條件(運算結果為true)的元素所組成的一個陣列, 該不會改變原陣列。
1 |
|
filter()的參數函數可以接受三個參數:當前元素,當前位置和整個陣列
1 |
|
some(),every()
回傳一個 boolean值,表示判斷陣列中的元素是否符合某種條件。
兩者都接受三個參數:當前元素、當前位置和整個陣列,然後回傳一個boolean值。
some()方法
只要一個(以上)元素的回傳值是true
,則整個some()
的回傳值就是true
,否則回傳false
。另外,some( )
會在第一次遇到運算結果為true
時,就停止繼續對元素運算
1 |
|
every方法
所有元素的回傳值都是true
,整個ever()才回傳true
,否則回傳false
1 |
|