在 JavaScript 中,Array的實例是常規物件,裝飾著許多實用方法。
它包含 length屬性,以及用於遍歷、分析和修改陣列的方法。
陣列的元素是該陣列的索引屬性。
與其手動迭代那些索引屬性,不如使用陣列分析。
許多分析陣列內容的內建函式會接受一個回傳 true 或 false 的函式作為引數。這樣的函式稱為 predicate。
一般而言,使用這些抽象/內建方法比使用 for或.forEach等寫法更符合慣例、更具可讀性且更好維護。
const values = [1, 2, 5, 8, 8, 10];
// Array#some stops iteration as soon as the given predicate returns true; it
// returns false if none of the elements in the array pass the predicate. In
// other words: return true if for some item the given function returns true.
//
const isOdd = (item) => item % 2 === 1;
const areSomeOdd = values.some(isOdd);
// => true
// Array#every stops iteration as soon as the given predicate returns false; it
// returns true if each and every element passes the predicate. In other words:
// return true if for every item the given function returns true
//
const areAllPositive = values.every((item) => item >= 0);
// => true
// Most array analysis predicates get more than one argument as their input. In
// most cases it will be:
//
// 1. item: the current element being evaluated
// 2. index: the index associated with that element
// 3. self: the array itself
//
// Since Array#indexOf(value) returns the first index of value in the array, it
// can be used to determine if a particular (item, index) pair does NOT match
// the first occurrence of the item. Only for the first occurrence, the index
// of the item will match the passed in index.
//
// ['a', 'b', 'a'].indexOf('a')
// // => 0
//
// isDuplicate('a', 0, ['a', 'b', 'a'])
// // => false
// isDuplicate('b', 1, ['a', 'b', 'a'])
// // => false
// isDuplicate('a', 2, ['a', 'b', 'a'])
// // => true
//
function isDuplicate(item, index, self) {
return self.indexOf(item) !== index;
}
const indexOfFirstDuplicate = values.findIndex(isDuplicate);
// => 4
// Some of the analysis functions don't take a predicate but instead take a
// value directly.
//
// Array#includes is the same as the more verbose options:
//
// values.some((item) => item === 42)
// values.indexOf(42) !== -1
//
// Array#indexOf is the same as the more verbose option:
//
// values.findIndex((item) => item === 42) !== 1
//
const hasValue42 = values.includes(42);
// => false