[JS] JavaScript 陣列(Array)
Array 的所有方法 @ MDN
TL;DR
Array.isArray(obj) // 檢驗是否為陣列
const arrCopy = [...arr] // 複製陣列(copy array)@ airbnb 4.3
const nodes = [...arrayLike] // 將 array-like(例如 NodeList) 轉成 array @ airbnb 4.4
/**
* 建立陣列
**/
let arr = [element0, element1, ..., elementN] /* Good */
let arr = new Array(element0, element1[, ...[, elementN]]) /* Bad */
let arr = new Array(arrayLength)
/**
* 原陣列不會被改變 (non-mutating) 的方法
**/
arr.at(-1) // 取出陣列的最後一個元素,可以用來替換 arr[arr.length-1] 的寫法
arr.with(<index>, <value>) // 把元素為 index 的資料換成 value
arr.map( callback<element> ) // 用來將陣列中的元素做轉換(computed),搭配 return
arr.forEach( callback<item, index, array> ) // 用來疊代陣列中的元素,並執行動作,不需搭配 return
arr.slice(begin, end) // 用來擷取陣列中的部分元素(不包含 end)
arr.filter( callback<item, index, array> ) // 若 callback return 為 true 時則保留該元素
arr.reduce( callback<accumulator, currentValue, currentIndex, array>, initialValue ) // 搭配 return ,return 的內容會進到 accumulator,最後回傳 accumulator
arr.concat(value1, [value2], ...) // 把陣列連接在一起
// 根據 callback 的規則篩選,需在 callback 中搭配 return 使用
arr.some( callback<item, index, array> ) // 檢驗陣列中是否有符合該 callback 規則的元素,有的話回傳 true
arr.every( callback<item, index, array> ) // 檢驗陣列中所有元素是否都符合 callback 規則,有的話回傳 true
arr.find( callback<item, index, array> ) // 檢驗陣列中是否有符合該 callback 規則的元素,有的話回傳第一個找到的元素值
arr.findIndex( callback<item, index, array> ) // 檢驗陣列中是否有符合該 callback 規則的元素,有的話回傳第一個找到的 index
// 根據 target 篩選
arr.includes(target, fromIndex) // 檢驗陣列中是否包含 target 這個 element,有的話回傳 true
arr.indexOf( target, fromIndex ) // 返回找到該元素的第一個 index 值,若找不到則回傳 -1
/**
* 原陣列會被改變(mutation method)
**/
arr.pop() // 刪除最後一個元素
arr.push() // 將元素塞入陣列中
arr.shift() // 刪除陣列中第一個元素
arr.splice(start, deleteCount, newItem) // 用來移除陣列中的部分元素,並可補入新元素
arr.sort(compareFunction) // 根據 compareFunction 來將陣列重新排序
arr.copyWithin(target, start, end)
/**
* 其他
*/
arr.join('<str>') // 將陣列以 <str> 連接成字串,預設是","
Array 的所有方法 @ MDN
Snippets and Utilities
判斷式否為陣列(型別判斷)
keywords: Array.isArray()
Array.isArray([]); // true
Array.isArray([1]); // true
Array.isArray(new Array()); // true
Array.isArray(); // false
Array.isArray({}); // false
Array.isArray(null); // false
Array.isArray(undefined); // false
將 array-like 的 Node List 轉成 Array
// rails/activestorage/app/javascript/activestorage/helpers.js
function toArray(value) {
if (Array.isArray(value)) {
return value;
} else if (Array.from) {
return Array.from(value);
} else {
return [].slice.call(value);
}
}
從陣列中隨機抽取一個元素(sample element in array)
var rand = myArray[Math.floor(Math.random() * myArray.length)];
Getting a random value from a JavaScript array @ StackOverflow
建立一個長度為 n 且內容相同的陣列
/**
* 建立一個長度為 length ,且所有內容均為 'element' 的陣列
* create an array with same element in given length
**/
Array(_length_).fill(_element_);
Array(10).fill('ele');
// [ 'ele', 'ele', 'ele', 'ele', 'ele', 'ele', 'ele', 'ele', 'ele', 'ele' ]
建立一個元素從 1 ~ n 的陣列
使用 Array(5)
(或 new Array(5)
)可以產生一個帶有 5 個 empty
元素的陣列,透過解構賦值可以讓這些元素變成 undefined
:
Array(5) // [empty × 5]
[...Array(5)] // [undefined, undefined, undefined, undefined, undefined]
[...Array(5).keys()] // [0, 1, 2, 3, 4]
Array(5).keys() // Array Iterator {}
若不是單純要從 0 開始,則可以使用 Array.from()
搭配第二個參數 mapFn 把值填入:
let array1to5 = Array.from({ length: 5 }, (val, index) => index + 1); // [1, 2, 3, 4, 5]
let array1to5 = Array.from(new Array(5), (val, index) => index + 1); // [1, 2, 3, 4, 5]
new Array(1)
和Array(1)
的本質上是一樣的,參考 Stack Overflow。