聊聊數(shù)組遍歷方法
JS 數(shù)組的遍歷方法有好幾個(gè):
- every
- some
- filter
- foreach
- map
- reduce
接下來(lái)我們來(lái)一個(gè)個(gè)地交流下镣丑。
every()
arr.every(callback[, thisArg])
返回值:true | false
是否改變?cè)瓟?shù)組:不改變?cè)瓟?shù)組
解析:
every() 方法用來(lái)測(cè)試數(shù)組中的每一項(xiàng)是否都通過(guò)了callback函數(shù)的測(cè)試舔糖;只有全部通過(guò)才返回 true;否則 false莺匠。
本文出現(xiàn)的 callback 沒有特別聲明都是表示包含 element, index, array 三個(gè)參數(shù)的函數(shù)金吗。
例子:
// 檢測(cè)數(shù)組中的所有元素是否都大于或等于100
[].every((ele) => ele >= 100); // true
[1, 2, 3].every((ele) => ele >= 100); // false
some()
arr.some(callback[, thisArg])
返回值:true | false
是否改變?cè)瓟?shù)組:不改變
解析:
some() 跟 every() 類似,只是 every 要每一項(xiàng)都通過(guò) callback 才返回 true趣竣,而 some 只要有通過(guò) callback 的就返回 true摇庙;some 為邏輯或,every 為邏輯與遥缕。
例子:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true
filter()
var newArr = arr.filter(callback[, thisArg])
返回值:新數(shù)組
是否改變?cè)瓟?shù)組:不改變?cè)瓟?shù)組
解析:
filter() 方法會(huì)對(duì)數(shù)組中的每一項(xiàng)(首先這項(xiàng)是有值的)進(jìn)行調(diào)用 callback 函數(shù)卫袒,并根據(jù)調(diào)用結(jié)果返回的 true 或 false 來(lái)組建一個(gè)新的數(shù)組(該數(shù)組是原數(shù)組的子集)。
即過(guò)濾单匣,只有符合的(調(diào)用 callback 返回 true 的)才加入到新數(shù)組中夕凝。
例子:
const isBigEnough = value => value >= 10;
let [...spread] = [12, 4, 8, 120, 44];
let filtered = spread.filter(isBigEnough);
// filtered: [12, 120, 44]
// spread: [12, 4, 8, 120, 44]
forEach()
array.forEach(callback[, thisArg])
返回值:undefined
是否改變?cè)瓟?shù)組:改不改變要看 callback
解析:
forEach() 方法按升序?yàn)閿?shù)組中含有效值的每一項(xiàng)執(zhí)行一次 callback 函數(shù),那些已刪除(使用delete方法等情況)或者未初始化的項(xiàng)將被跳過(guò)(但不包括那些值為 undefined 的項(xiàng))(例如在稀疏數(shù)組上)户秤。反正它就是很死板码秉。
例子:
// three 呢?它被跳過(guò)了鸡号,原因是到two時(shí)转砖,使數(shù)組發(fā)生了變化,導(dǎo)致所有剩下的項(xiàng)上移一個(gè)位置鲸伴,所以three被跳過(guò)了
let words = ['one', 'two', 'three', 'four'];
words.forEach((word) => {
console.log(word);
if ( word === 'two' ) {
words.shift();
}
});
// one
// two
// four
map()
let newArr = arr.map(callback[, thisArg])
返回值:新數(shù)組
是否改變?cè)瓟?shù)組:不改變
解析:
map() 方法就是數(shù)組中的每一項(xiàng)(有值)按順序都調(diào)用一次 callback 函數(shù)府蔗,然后每一項(xiàng)的返回結(jié)果組成一個(gè)新的數(shù)組作為整個(gè)map方法的返回值。
例子:
let str = '12345';
Array.prototype.map.call(str, (x) => x).reverse().join('');
// '54321'
reduce()
arr.reduce(callback[, initialValue])
返回值:callback函數(shù)累計(jì)處理的結(jié)果
是否改變?cè)瓟?shù)組:
解析:
reduce() 方法的 callback 有四個(gè)參數(shù)汞窗,比之前說(shuō)的多了一個(gè)累計(jì)的返回值姓赤;四個(gè)參數(shù):accumulator、currentValue杉辙、currentIndex模捂、array捶朵;initialValue 是用作第一個(gè)調(diào)用 callback 的第一個(gè)參數(shù)的值,默認(rèn)使用數(shù)組中的第一個(gè)元素狂男。
reduce() 方法跟 map 有點(diǎn)相似综看,都是數(shù)組中的每一個(gè)元素(有效值)一次執(zhí)行 callback 函數(shù),多就多在它會(huì)存上上一次 callback 計(jì)算結(jié)果作為下一次的參數(shù)岖食。
如果沒有提供 initialValue红碑, reduce會(huì)從索引1的地方開始執(zhí)行 callback方法,跳過(guò)第一個(gè)索引泡垃。如果提供 initialValue析珊, 從索引0開始
例子:
// 求和
let sum = [0, 1, 2, 3, 4].reduce((prev, curr) => prev + curr, 0);
// 計(jì)算數(shù)組中每個(gè)元素出現(xiàn)的次數(shù)
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let countedNames = names.reduce((allNames, name) => {
if ( name in allNames ) {
allNames[name]++;
} else {
allNames[name] = 1;
}
return allNames;
}, {});
// countedNames:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
// 數(shù)組去重
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let result = arr.sort().reduce((init, current) => {
// 主要是排了序
if ( init.length === 0 || init[init.length - 1] !== current ) {
init.push(current);
}
return init;
}, []);
console.log(result);