Js數(shù)組遍歷方法總結(jié)

前言

ES5和ES6都新增了很多對(duì)數(shù)組遍歷的方法,本文主要介紹forEach互妓、map、filter坤塞、some冯勉、every、reduce / reduceRight摹芙、find/findIndex方法灼狰,它們可以讓我們更方便的編寫代碼,拋棄for循環(huán)浮禾。而這些方法有個(gè)共同的特點(diǎn)都是不改變?cè)械臄?shù)組交胚。

forEach

forEach是最基本的方法,它的作用是對(duì)數(shù)組的每個(gè)元素執(zhí)行一次提供的函數(shù)盈电。

function log(element, index, array) {
  console.log('[' + index + '] = ' + element);
}

[2, 5, 9].forEach(log);
// [0] = 2
// [1] = 5
// [2] = 9

forEach方法中的回調(diào)函數(shù)會(huì)被依次傳入三個(gè)參數(shù):

  • 數(shù)組當(dāng)前項(xiàng)的值
  • 數(shù)組當(dāng)前項(xiàng)的索引
  • 數(shù)組對(duì)象本身

forEach方法除了可以傳入回調(diào)函數(shù)外蝴簇,還可以傳入第二個(gè)參數(shù)。如果給forEach傳遞了第二個(gè)參數(shù)匆帚,回調(diào)函數(shù)里的this將指向這個(gè)參數(shù)熬词。如果沒有傳入第二個(gè)參數(shù),則this指向全局對(duì)象(在瀏覽器是為window)吸重,嚴(yán)格模式下是undefined荡澎。

var out = [];

[1, 2, 3].forEach(function(elem) {
  this.push(elem * elem);
}, out);

out // [1, 4, 9]

map

map方法的作用就是將原數(shù)組按照一定的規(guī)則映射成一個(gè)新的數(shù)組均践。再將其返回,返回的是一個(gè)新的數(shù)組摩幔,而不是將原數(shù)組直接改變。forEachmap的區(qū)別在于鞭铆,forEach沒有返回值或衡。 map需要返回值,如果不給return车遂,默認(rèn)返回undefined封断。使用方法和參數(shù)都跟forEach相似。

var numbers = [1, 2, 3];

numbers.map(function (n) {
  return n + 1;
});
// [2, 3, 4]

numbers
// [1, 2, 3]

map方法接受的三個(gè)參數(shù):

  • 數(shù)組當(dāng)前項(xiàng)的值
  • 數(shù)組當(dāng)前項(xiàng)的索引
  • 數(shù)組對(duì)象本身

map方法還可以接受第二個(gè)參數(shù)舶担,用來綁定回調(diào)函數(shù)內(nèi)部的this變量(與forEach相視)坡疼。

var arr = ['a', 'b', 'c'];

[1, 2].map(function (e) {
  return this[e];
}, arr)
// ['b', 'c']

filter

filter方法用于過濾數(shù)組成員,滿足條件的成員組成一個(gè)新數(shù)組返回衣陶。用法和參數(shù)跟map差不多柄瑰。與map方法不同的是,filter方法的回調(diào)函數(shù)需要返回等于truefalse的值剪况。如果為true教沾,則通過,否則译断,不通過授翻。

[1, 2, 3, 4, 5].filter(function (elem) {
  return (elem > 3);
})
// [4, 5]

filter方法的參數(shù)函數(shù)可以接受三個(gè)參數(shù):當(dāng)前成員,當(dāng)前位置和整個(gè)數(shù)組孙咪。

[1, 2, 3, 4, 5].filter(function (elem, index, arr) {
  return index % 2 === 0;
});
// [1, 3, 5]

filter方法還可以接受第二個(gè)參數(shù)堪唐,用來綁定參數(shù)函數(shù)內(nèi)部的this變量。

var obj = { MAX: 3 };
var myFilter = function (item) {
  if (item > this.MAX) return true;
};

var arr = [2, 8, 3, 4, 1, 3, 2, 9];
arr.filter(myFilter, obj) // [8, 4, 9]

some & every

這兩個(gè)方法類似“斷言”(assert)翎蹈,返回一個(gè)布爾值淮菠,表示判斷數(shù)組成員是否符合某種條件。

  • every:數(shù)組中是否每個(gè)元素都滿足指定的條件
  • some:數(shù)組中是否有元素滿足指定的條件

every方法是所有成員的返回值都是true杨蛋,整個(gè)every方法才返回true兜材,否則返回false

var arr = [1, 2, 3, 4, 5];
arr.every(function (elem, index, arr) {
  return elem >= 3;
});
// false

some方法是只要一個(gè)成員的返回值是true逞力,則整個(gè)some方法的返回值就是true曙寡,否則返回false

var arr = [1, 2, 3, 4, 5];
arr.some(function (elem, index, arr) {
  return elem >= 3;
});
// true

注意: 對(duì)于空數(shù)組寇荧,some方法返回false举庶,every方法返回true,回調(diào)函數(shù)都不會(huì)執(zhí)行揩抡。

function isEven(x) { 
    return x % 2 === 0 
}

[].some(isEven) // false
[].every(isEven) // true

reduce / reduceRight

reduce方法和reduceRight方法依次處理數(shù)組的每個(gè)成員户侥,最終累計(jì)為一個(gè)值,一般用來合并數(shù)組的值镀琉。它們的差別是,reduce是從左到右處理(從第一個(gè)成員到最后一個(gè)成員)蕊唐,reduceRight則是從右到左(從最后一個(gè)成員到第一個(gè)成員)屋摔,其他完全一樣。

var a = [1, 2, 3, 4, 5].reduce(function (a, b) {
  console.log(a, b);
  return a + b;
})

console.log(a) // 15
// 1 2
// 3 3
// 6 4
// 10 5
//最后結(jié)果:15

reduce方法和reduceRight方法的第一個(gè)參數(shù)都是一個(gè)函數(shù)替梨。該函數(shù)接受以下四個(gè)參數(shù)钓试。

  • 累積變量,默認(rèn)為數(shù)組的第一個(gè)成員
  • 當(dāng)前變量副瀑,默認(rèn)為數(shù)組的第二個(gè)成員
  • 當(dāng)前位置(從0開始)reduce方法如果提供了第二個(gè)參數(shù)弓熏,從0開始;否則從1開始糠睡。
  • 原數(shù)組
    這四個(gè)參數(shù)之中挽鞠,只有前兩個(gè)是必須的,后兩個(gè)則是可選的狈孔。
var a = [1, 2, 3, 4, 5].reduce(function (a, b, c, d) {
  console.log(a, b, c, d)
  return a + b;
});
console.log(a) // 15

image

如果要對(duì)累積變量指定初值信认,可以把它放在reduce方法和reduceRight方法的第二個(gè)參數(shù)(這時(shí)下標(biāo)從0開始)。

var a = [1, 2, 3, 4, 5].reduce(function (a, b) {
  return a + b;
}, 10);

console.log(a) // 25

上面的方法第二個(gè)參數(shù)相當(dāng)于提供了默認(rèn)值除抛,由于空數(shù)組取不到初始值狮杨,reduce方法會(huì)報(bào)錯(cuò)。這時(shí)到忽,加上第二個(gè)參數(shù)橄教,就能保證總是會(huì)返回一個(gè)值。

find / findIndex

find方法喘漏,用于找出第一個(gè)符合條件的數(shù)組成員护蝶。它的參數(shù)是一個(gè)回調(diào)函數(shù),所有數(shù)組成員依次執(zhí)行該回調(diào)函數(shù)翩迈,直到找出第一個(gè)返回值為true的成員持灰,然后返回該成員。如果沒有符合條件的成員负饲,則返回undefined堤魁。

var a = [1, 4, -5, 10].find((n) => n < 0)

var b = [1, 4, -5, 10].find((n) => n < -5)

console.log(a) // -5
console.log(b)  // undefined

find方法的回調(diào)函數(shù)可以接受三個(gè)參數(shù):

  • 當(dāng)前的值
  • 當(dāng)前的位置
  • 原數(shù)組
var a = [1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
})

console.log(a)  // 10

findIndex方法的用法與find方法非常類似,返回第一個(gè)符合條件的數(shù)組成員的位置返十,如果所有成員都不符合條件妥泉,則返回-1

var a = [1, 4, -5, 10].findIndex((n) => n < 0)

var b = [1, 4, -5, 10].findIndex((n) => n < -5)

console.log(a) // 2
console.log(b)  // -1

這兩個(gè)方法都可以接受第二個(gè)參數(shù)洞坑,用來綁定回調(diào)函數(shù)的this對(duì)象盲链。

function f(v){
  return v > this.age;
}
let person = {name: 'John', age: 20};
var a = [10, 12, 26, 15].find(f, person);    

console.log(a) // 26

另外,這兩個(gè)方法都可以發(fā)現(xiàn)NaN,彌補(bǔ)了數(shù)組的indexOf方法的不足刽沾。

[NaN].indexOf(NaN)
// -1

[NaN].findIndex(y => Object.is(NaN, y))
// 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末本慕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侧漓,更是在濱河造成了極大的恐慌锅尘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件火架,死亡現(xiàn)場(chǎng)離奇詭異鉴象,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)何鸡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牛欢,“玉大人骡男,你說我怎么就攤上這事“茫” “怎么了隔盛?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拾稳。 經(jīng)常有香客問我吮炕,道長(zhǎng),這世上最難降的妖魔是什么访得? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任龙亲,我火速辦了婚禮,結(jié)果婚禮上悍抑,老公的妹妹穿的比我還像新娘鳄炉。我一直安慰自己,他們只是感情好搜骡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布拂盯。 她就那樣靜靜地躺著,像睡著了一般记靡。 火紅的嫁衣襯著肌膚如雪谈竿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天摸吠,我揣著相機(jī)與錄音空凸,去河邊找鬼。 笑死蜕便,一個(gè)胖子當(dāng)著我的面吹牛劫恒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼两嘴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼丛楚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起憔辫,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤趣些,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贰您,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坏平,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年锦亦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舶替。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杠园,死狀恐怖顾瞪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抛蚁,我是刑警寧澤陈醒,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瞧甩,受9級(jí)特大地震影響钉跷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肚逸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一爷辙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吼虎,春花似錦犬钢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至洒疚,卻和暖如春歹颓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背油湖。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工巍扛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乏德。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓撤奸,卻偏偏與公主長(zhǎng)得像吠昭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胧瓜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. push()矢棚,pop() push方法用于在數(shù)組的末端添加一個(gè)或多個(gè)元素,并返回添加新元素后的數(shù)組長(zhǎng)度府喳。注意...
    東郭皮蛋閱讀 403評(píng)論 0 0
  • 好像沒更新技術(shù)博客蒲肋,倒是學(xué)習(xí)了不少新技術(shù),只是懶得寫出來钝满,還是得有個(gè)地方整理出來兜粘,以后每周更新一篇,給自己定個(gè)備忘...
    阿拉斯加南海岸線閱讀 929評(píng)論 0 2
  • 轉(zhuǎn)載:在開發(fā)中,數(shù)組的使用場(chǎng)景非常多碎捺,平日中也涉及到很多數(shù)組的api/相關(guān)操作距糖,一直也沒有對(duì)這塊內(nèi)容進(jìn)行一塊整理總...
    七色煙火閱讀 3,222評(píng)論 0 3
  • 數(shù)組總共有22種方法,本文將其分為對(duì)象繼承方法牵寺、數(shù)組轉(zhuǎn)換方法、棧和隊(duì)列方法恩脂、數(shù)組排序方法帽氓、數(shù)組拼接方法、創(chuàng)建子數(shù)組...
    Sachie閱讀 901評(píng)論 0 7
  • ES5 數(shù)組方法 最近總結(jié)了一些ES5和ES6數(shù)組的一些方法俩块,希望能給大家?guī)硪恍椭?1.Array.isAr...
    前端的搬運(yùn)工閱讀 1,660評(píng)論 1 15