Javascript數(shù)組的迭代

一乖订、概述:

在編程中,經(jīng)常需要對數(shù)據(jù)結(jié)構(gòu)進行遍歷沃于,在Javascript中它呀,從早期的Array、Object(泛指對Object的key的遍歷)洛勉,到ES6中的Set粘秆、Map的遍歷。
初學Javascript的同學收毫,最常用的便是使用for攻走、for in對數(shù)組、對象進行遍歷此再,但這兩種方法往往不是最佳的方案昔搂。本文將介紹本人所總結(jié)的比較常用、高效的遍歷方案输拇。

二摘符、數(shù)組的遍歷

1、for循環(huán)

var arr = [1,2,3,4];
for(var i=0, len=arr.length; i<len; i++){
  console.log(arr[i])
}

這種遍歷的方式大家已經(jīng)十分熟悉策吠,在此不再贅述逛裤,僅作展示。
需要注意的便是如下涉及閉包的情況:

var arr = [1,2,3,4];
for(var i=0, len=arr.length; i<len; i++){
  setTimeout(function(){
    console.log(arr[i])
  }, 20)
}

// output: undefined * 4  (即為 arr[4] 4次)

2猴抹、數(shù)組迭代方法

Javascript在ES5中带族,支持forEach、map蟀给、every蝙砌、some、filter迭代方法坤溃,這5種方法均為Array.prototype上的方法拍霜,分別有各自的應用場景,以下分別簡單介紹薪介,聲明數(shù)組arr并賦值:

var arr = [1,2,3,4,5];

Array.prototype.forEach :
詳細用法可參考:MDN文檔Array.prototype.forEach祠饺,本文僅作總結(jié):

代碼相比for更加簡潔,邏輯也較為清晰汁政,大部分場景下推薦使用forEach道偷。

// forEach
// 示例 1
arr.forEach(function(item, idx, arr){
  console.log(item + '-' + idx)  // output: 1-0 2-1 3-2 4-3 5-4
})

// 示例 2
arr.forEach(function(item){
  setTimeout(function(){
    console.log(item)  // output: 1 2 3 4 5 ,可以避免for循環(huán)中出現(xiàn)的閉包問題
  }, 20)
})

// 示例 3
var obj = {
  name: 'Javascript'
}
arr.forEach(function(item){
  console.log(this.name) // output: Javascript * 4
}, obj)

Array.prototype.map :
詳細用法可參考:MDN文檔Array.prototype.map记劈。

map與forEach的遍歷方式一致勺鸦,區(qū)別在于map中會將每次迭代函數(shù)執(zhí)行結(jié)果組成一個新的數(shù)組返回,如下:

var newArr = arr.map(function(item){
  return item * 2
})
console.log(newArr) // output: [2, 4, 6, 8, 10]

// ES6 寫法
var newArr2 = arr.map(item => item*2)

map遵循函數(shù)式編程的原則目木,不對原數(shù)組作修改换途,僅返回新數(shù)組,是十分常用的數(shù)組遞歸方法,而且在性能測試中军拟,微微領(lǐng)先于for剃执、forEach(實際差別不大,可以忽略)懈息。
forEach適用的范圍肾档,map均可以勝任,所以辫继,可以看到在開源項目中怒见,大量使用map替代forEach來進行迭代。
此外姑宽,由于map返回Array對象遣耍,因此,可以實現(xiàn)鏈式調(diào)用低千。

Array.prototype.filter :
詳細用法可參考:MDN文檔Array.prototype.filter配阵。

filter用于篩選出數(shù)組中符合條件的元素,并組成新的數(shù)組示血,如下:

var filtered = arr.filter(function(item){
  return item>3
})

console.log(filtered)  // output: [4, 5]

Array.prototype.some :
詳細用法可參考:MDN文檔Array.prototype.some

some判斷數(shù)組中至少有一項元素滿足指定條件救拉,如下:

var isHas = arr.some(function(item){
  return item>3
})

console.log(isHas) // output: true

Array.prototype.every :
詳細用法可參考:MDN文檔Array.prototype.every难审。

every用以判斷數(shù)組是否每一項均滿足條件,如有一項不滿足亿絮,則跳出循環(huán):

var isEvery = arr.every(function(item){
  return item<4
})

console.log(isEvery) // output: false

總結(jié):

  • 在對數(shù)組進行遍歷的時候告喊,如果只需依次遍歷每個元素,可使用forEach或map方法派昧;
  • 需要將每一項處理結(jié)果返回的黔姜,可使用map方法;
  • 判斷是否每一項均符合條件時蒂萎,使用every秆吵;
  • 判斷是否至少有一項滿足條件,使用some五慈;
  • 需要篩選出符合條件的所有項組成數(shù)組纳寂,使用filter;
  • map泻拦、filter可以實現(xiàn)鏈式調(diào)用毙芜。

3、for...of 與 迭代器(ES6)

在ES6中争拐,新增了迭代器對象腋粥,可以通過迭代器對數(shù)組進行迭代,例如以下代碼:

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

for(var value of arr){
  console.log(value) // output: 'a' 'b' 'c' 'd' 'e'
}

for(var key of arr.keys()){
  console.log(key) // output: 0 1 2 3 4
}

for(var each of arr.entries()){
  console.log(each)
  // output: [0, 'a'], [1, 'b'], [2, 'c'], [3, 'd'], [4, 'e']  即:[key, value]
}

具體用法可參考:MDN文檔for...of迭代

數(shù)組對象默認使用值作為迭代的值,開發(fā)者可根據(jù)需要隘冲,使用keys金赦、 entries分別返回數(shù)組的鍵、鍵值對作為值的迭代對象对嚼。
使用for...of語句夹抗,可以減少大量的代碼量,并且邏輯清晰纵竖,使用方法靈活漠烧,在支持ES6的環(huán)境中,強烈推薦使用靡砌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末已脓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子通殃,更是在濱河造成了極大的恐慌度液,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件画舌,死亡現(xiàn)場離奇詭異堕担,居然都是意外死亡,警方通過查閱死者的電腦和手機曲聂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門霹购,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朋腋,你說我怎么就攤上這事齐疙。” “怎么了旭咽?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵贞奋,是天一觀的道長。 經(jīng)常有香客問我穷绵,道長轿塔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任请垛,我火速辦了婚禮催训,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宗收。我一直安慰自己漫拭,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布混稽。 她就那樣靜靜地躺著采驻,像睡著了一般审胚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礼旅,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天膳叨,我揣著相機與錄音,去河邊找鬼痘系。 笑死菲嘴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的汰翠。 我是一名探鬼主播龄坪,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼复唤!你這毒婦竟也來了健田?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤佛纫,失蹤者是張志新(化名)和其女友劉穎妓局,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呈宇,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡好爬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了攒盈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抵拘。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖型豁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尚蝌,我是刑警寧澤迎变,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站飘言,受9級特大地震影響衣形,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姿鸿,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一谆吴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苛预,春花似錦句狼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胳螟。三九已至,卻和暖如春筹吐,著一層夾襖步出監(jiān)牢的瞬間糖耸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工丘薛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘉竟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓洋侨,卻偏偏與公主長得像舍扰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凰兑,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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