JavaScript Array 紀錄
Array 的方法
判別是否為陣列
isArray( )
- 內建 typeof 去檢查陣列得到 “object” 的結果 回傳 truetoString.call
- 所有情況都可以正確判斷。判斷陣列以外的其他特別物件,缺點是效率最差
Properties (屬性)
length
- 回傳 Array 元素長度(成員個數)
Search(搜尋)
includes( )
- 判斷元素有沒有在 Array 裡面 回傳 true | falseindexof( )
- 回傳第一個被找到的元素 index;若不存在則回傳 -1lastIndexof( )
- 回傳最後一個被找到的元素 index;若不存在則回傳 -1
Operation(操作)
pop( )
- 移除陣列最後面的值,回傳 被移除掉的值push( )
- 增加一個 或 多個元素至陣列尾端 ,回傳 陣列的新 lengthshift( )
- 移除陣列最前面的值,回傳 被移除掉的值unshift( )
- 增加陣列最前面的值,回傳 陣列的新 lengthslice( )
- 用淺拷貝(shallow copy)的方式分割元素出子陣列,回傳一個新 Array (舊 Array 不變動)splice( )
- 藉由刪除並/或增加新元素來改變陣列內容,回傳一個改變後的 Arrayconcat( )
- 合併兩個或多個陣列。回傳一個新 Array (舊 Array 不變動)join( )
- 把所有陣列裡的值加上 separator(符號),回傳一個字串
Iteration (迭代 callback)
forEatch( )
- 不會return任何東西 & 中斷,單純執行 function 改變原本陣列裡的事find( )
- 回傳一個值,且是 第一個 抓到條件為 true 的值,否則回傳 undefined- 搜尋陣列中符合條件的物件
findIndex( )
- 尋找符合的元素回傳其 index,若沒有符合的對象則回傳 -1filter( )
- 回傳一個 Array,只要條件為 true 的所有值 or Array,適合拿來搜尋map( )
- return 後方為 true 運算後的值 or 新 Array,用在判斷回傳 true | falsesome( )
- 回傳一個值 false | true,只要部分符合就回傳 true,只要一找到相符的值就跳出every( )
- 回傳一個值 false | true,需要全部符合才回傳 true
Iteration (迭代 callback) - Special
reduce( )
- 由 callback function 前後值兩相運算,然後縮減陣列中的元素,最終回傳一個值- 收到前一個回傳的值供下一個物件使用,很適合用在累加與比對上
rightReduce( )
- 陣列中每一個值(由右至左)傳入 callback function,最終回傳一個值
Order(排序)
sort( )
- 將 Array 排序,排序順序是根據字串的 Unicode 編碼位置(code points)而定- 排序過的陣列,不是原陣列的 copy,而是直接更改原陣列
- localeCompare - 判斷在目前地區設定中兩個字串是否相等
reverse( )
- 反轉後的 Array
Array 方法的效果
判別是否為陣列
- 初始值
1 | const ary = ['red','green','blue'] |
- Array.isArray(obj)
- Obj - 要檢查的物件
1 | Array.isArray(ary) // true |
Properties (屬性)
- Array.isArray
- 回傳 Array 元素長度
1 | ary.length // 6 |
Method (方法)
Search(搜尋)
- 初始值
1 | const ary = [9,2,5,3,7,6,1] |
- Array.prototype.includes()(searchElement[, fromIndex]) -> (搜索元素,[元素的索引])
- 判斷陣列是否包含特定的元素 回傳 true | false
1 | let a = ary.includes(9) |
- Array.prototype.indexOf()(searchElement[, fromIndex]) -> (搜索元素,[元素的索引])
- 回傳第一個被找到的元素 index;若不存在則回傳 -1
1 | const indexArray = ary.indexOf(3) |
- Array.prototype.lastIndexOf()(searchElement[, fromIndex]) -> (搜索元素,[元素的索引])
- 回傳最後一個被找到的元素 index;若不存在則回傳 -1
1 | const indexArray = ary.lastIndexOf(7) |
Operation(操作)
- 初始值
1 | const color = ['red','blue','yellow','green'] |
- Array.prototype.pop()
- 移除陣列最後一個元素
1 | const newColor = color.pop() |
- Array.prototype.push()
- 增加一個 或 多個元素至陣列尾端
1 | const newColor = color.push('black’) |
- Array.prototype.shift( )
- 移除陣列最前面的值
1 | const newColor = color.shift() |
- Array.prototype.unshift(element1[, …[, elementN]]) -> (元素1,[元素N])
- 增加陣列最前面的值
1 | const newColor = color.unshift('black','white’) |
- Array.prototype.slice([begin[, end]]) -> (元素開始位置,[元素結束位置])
- 用淺拷貝(shallow copy)的方式分割出元素值陣列,回傳一個新 array (舊 array 不變動)
1 | const newColor = color.slice(-1) |
- Array.prototype.splice(start[, deleteCount[, item1[, item2[, …]]]]) -> (元素開始位置,[刪除元素數量],[增加的元素])
- 藉由刪除並|增加新元素來改變陣列內容,回傳一個改變後的 array
- return 分割出元素值陣列
1 | const newColor = color.splice(-1) |
- Array.prototype.concat(value1[, value2[, …[, valueN]]]) -> (元素1[, 元素2[, …[, 元素N]]])
- 合併兩個或多個陣列,回傳一個新 array (舊 array 不變動)
1 | const newArray = color.concat(['1','4','5','3']) |
- Array.prototype.join([separator]) -> (符號)
- 把所有陣列裡的值加上 separator(符號),回傳一個字串
1 | const newArray = color.join("-") |
Iteration (迭代 callback)
- (function callback(currentValue[, index[, array]]) { // your iterator }[, thisAge])
- 項目屬姓名可不同 順序要相同
- callback 函式將會把 Array 中的每個元素作為參數,帶進 callback 函式裡,每個元素各執行一次,接收三個參數:
- currentValue(必須) - 原陣列目前所迭代的元素(當前變數) - 元素屬性值
- index(選用) - 原陣列目前所迭代的元素 index(當前變數的index) - 元素index
- array(選用) - 呼叫 forEach() 方法的陣列,也就是上面語法中的 array - 元素array
- thisAge(選用) - 執行 callback function 時被當作 this 的物件
- 初始值
1 | const airport = [ |
- Array.prototype.forEach(currentValue, currentIndex, array[, thisArg])
- 不會return任何東西,單純執行 function 改變原本陣列裡的事
- forEach( ) 不會為沒有值的數組元素執行函數
- forEach 這類型的方法無法中斷,如果想要中斷迴圈的執行會建議使用傳統的 for…loop
1 | let air = airport.forEach(function(i){ |
- Array.prototype.find(currentValue, currentIndex, array[, thisArg])
- 回傳一個值,且是 第一個 抓到條件為 true 的值,否則回傳 undefined
1 | const go = airport.find(function(item){ |
- Array.prototype.findIndex(currentValue, currentIndex, array[, thisArg])
- 尋找符合的元素回傳第一個其 index,若沒有符合的對象則回傳 -1
1 | const go = airport.findIndex(function(item){ |
- Array.prototype.filter(currentValue, currentIndex, array[, thisArg])
- 回傳一個 array,只要條件為 true 的就會包含在此陣列,適合拿來搜尋符合條件的參數
- 是否滿足特定條件並返回一個新 array
1 | const go = airport.filter(function(item){ |
- Array.prototype.map(currentValue, currentIndex, array[, thisArg])
- 將原陣列的每一個元素經由 callback function 運算後所回傳的新 array
- 用 ES6 ‘=>’ 不用加 return
1 | const go = airport.map(function(item){ |
- Array.prototype.some(currentValue, currentIndex, array[, thisArg])
- 回傳一個值 false | true,只要一找到相符的值就跳出
1 | const back = airport.some(function(i){ |
- Array.prototype.every(currentValue, currentIndex, array[, thisArg])
- 回傳一個值 false | true,需要全部符合才回傳 true
1 | const back = airport.every(function(i){ |
Iteration (迭代 callback) - Special
- reduce( ) - (function callback([accumlator, currentValue, index, array]),[initialValue])
- rightReduce( ) - (function callback([previousValue, currentValue, index, array]),[initialValue])
- callback 函式將會把 Array 中的每個元素作為參數,帶進 callback 函式裡,每個元素各執行一次,接收四個參數:
- accumlator
- 前一個參數,如果是第一個陣列的話,值是以另外傳入或初始化的值
- 暫時存放回呼函式回傳值的累加器(累加器是上一次呼叫後,所回傳的累加數值)
- 第一個元素從 initialValue 開始,沒有提供 initialValue,則 accumulator 會等於陣列的第一個元素值,且 currentValue 將會等於陣列的第二個元素值
- currentValue - 原陣列目前所迭代的元素(當前變數) - 項目屬性值
- index(選用) - 原陣列目前所迭代的元素 index(當前變數的 index) - 項目 index
- 若有傳入 initialValue,則由索引 0 之元素開始,若無則自索引 1 之元素開始
- array(選用) - 呼叫 reduce() 方法的陣列 - 項目 array
- initialValue - 初始值
- previousValue - 最後一個元素從 initialValue 開始.若沒有提供 initialValue,則 previousValue 會等於陣列的最後一個元素值,且 currentValue 將會等於陣列的倒數第二個元素值
- accumlator
1 | let people = [ |
- 初始值
1 | let num = [4,2,65] |
- Array.prototype.reduce(accumulator, currentValue, currentIndex, array [, initialValue])
- 由 callback function 前後值兩相運算,然後縮減陣列中的元素,最終回傳一個值
1 | let a = num.reduce(function(accumulator, currentValue, currentIndex){ |
callback | accumulator | currentValue | currentIndex | array | return value |
---|---|---|---|---|---|
First call | 0 | 4 | 0 | [4,2,65] | 4 |
Second call | 4 | 2 | 1 | [4,2,65] | 6 |
Third call | 6 | 65 | 2 | [4,2,65] | 71 |
- initialValue - 初始值變更
1 | let a = num.initialValue(function(accumulator, currentValue, currentIndex){ |
callback | accumulator | currentValue | currentIndex | array | return value |
---|---|---|---|---|---|
First call | 100 | 4 | 0 | [4,2,65] | 104 |
Second call | 104 | 2 | 1 | [4,2,65] | 106 |
Third call | 106 | 65 | 2 | [4,2,65] | 171 |
- Array.prototype.reduceRight(accumulator, currentValue, currentIndex, array [, initialValue])
- 陣列中每一個值(由右至左)傳入callback function,最終回傳一個值
1 | let a = num.reduceRight(function(accumulator, currentValue, currentIndex){ |
callback | accumulator | currentValue | currentIndex | array | return value |
---|---|---|---|---|---|
First call | 0 | 65 | 0 | [4,2,65] | 65 |
Second call | 65 | 2 | 1 | [4,2,65] | 67 |
Third call | 67 | 4 | 2 | [4,2,65] | 71 |
- initialValue - 初始值
1 | let a = num.initialValue(function(accumulator, currentValue, currentIndex){ |
callback | accumulator | currentValue | currentIndex | array | return value |
---|---|---|---|---|---|
First call | 100 | 65 | 0 | [4,2,65] | 165 |
Second call | 165 | 2 | 1 | [4,2,65] | 167 |
Third call | 167 | 4 | 2 | [4,2,65] | 171 |
map filter reduce 差異 (這張好懂)
- map - 就像每一個基本食物素材加工後輸出我想要的樣子
- filter - 選我想要吃的
- reduce - 把這些食物吃完做後的結果
- 引用 François-Guillaume Ribreau
Order(排序)
- 初始值
1 | const num = [40, 1, 5, 200] |
- Array.prototype.sort(compareFunction)
- 將 array 排序,排序順序是根據字串的 Unicode 編碼位置(code points)而定
1 | const item = num.sort(function(i){ |
- Sort 中文字排序 - 用 string的方法 得到中文排序
- String.prototype.localeCompare(compareString[, locales[, options]])
- string(必要) - 要比較的第一個字串
- gtggtggggtgffddfdlocaleCompare - 判斷在目前地區設定中兩個字串是否相等
- compareString(必要) - 要比較的第二個字串
- locales(選用) - 語言環境
1 | // 初始值 |
- Array.prototype.reverse()
- 反轉後的陣列
1 | var a = ['one', 'two', 'three']; |
統整
Method | Array data | return | 作用 |
---|---|---|---|
Search(搜尋) | — | — | — |
includes( ) | 不變 | true | false | 搜尋陣列中有沒有要找的元素值(boolean) |
indexof( ) | 不變 | 第一個元素 index / 不存在則回傳 -1 | 回傳第一個被找到的元素 index |
lastIndexof( ) | 不變 | 最後一個元素 index / 不存在則回傳 -1 | 回傳最後一個被找到的元素 index |
Operation(操作) | — | — | — |
pop( ) | 改變 | 一個值 | 移除 Array 尾端的值 |
push( ) | 改變 | 新 length | 增加一個 或 多個元素到 Array 尾端 |
shift( ) | 改變 | 一個值 | 移除 Array 最前端的值 |
unshift( ) | 改變 | 新 length | 增加值到 Array 最前端 |
splice( ) | 改變 | 新 Array | 在一定範圍分割出要的 Array 值 or 增加 Array 值 |
slice() | 不變 | 新 Array | 在一定範圍分割出要的 Array 值 |
concat( ) | 不變 | 新 Array | 合併兩個 or 多個 Array |
join( ) | 不變 | string | 合併符號產生 String |
Iteration (迭代 callback) | — | — | — |
forEatch( ) | 改變 | 不會 return 任何東西 | 無法 break 或者 return false 中斷,會跳過空元素 |
find( ) | 不變 | 一個值 | 找到一個符合條件的元素值 |
findIndex( ) | 不變 | index | 找到一個符合條件的元素值 index |
filter( ) | 不變 | 值 or Array | return 後方為 true 符合條件的所有值 or Array |
map( ) | 不變 | 值 or Array | return 後方為 true 運算後的值 or 新 Array,用在判斷回傳 true|false |
some( ) | 不變 | false|true | 條件部分符合 |
every( ) | 不變 | false|true | 條件全部符合 |
Iteration (迭代 callback) - Special | — | — | — |
reduce( ) | 不變 | 一個值 | 接續上一個 or 尾端初始值與元素值進行計算 |
rightReduce( ) | 不變 | 一個值 | 接續上一個 or 尾端初始值與元素值從右邊開始進行計算 |
Order(排序) | — | — | — |
sort( ) | 改變 | 新 Array | 將 Array 排序(依照 Unicode 編碼位置) |
reverse( ) | 改變 | 新 Array | 反轉元素 |