最全的數(shù)組操作方法拾积,你造嗎?

在 JavaScript 中丰涉,對于數(shù)組的操作非常頻繁拓巧,對應(yīng)的 API 也很豐富 。ECMAScript 規(guī)范在每一版發(fā)布時一死,都會提供新的 API 來增強數(shù)組的操作能力肛度,下面將詳細介紹這些 API 的一些特性。



ES5 新增的 9 個API


forEach( callback, [thisArg] )

在 ES5 之前投慈,我們可以通過 for 和 for in 兩種方式來遍歷數(shù)組承耿。

ES5 引入了一個新方法 forEach,使數(shù)組遍歷更加簡潔伪煤,

forEach需要傳遞兩個參數(shù)加袋,第一個參數(shù)是回調(diào)函數(shù),是必選參數(shù)抱既,第二個參數(shù)是一個對象职烧,用來改變 callback 中的 this 指向,是可選參數(shù)防泵。


輸出結(jié)果:

a 0 ['a', 'b', 'c']
b 1 ['a', 'b', 'c']
c 2 ['a', 'b', 'c']

callback 中傳入了3個參數(shù) v,i,r 分別表示當前元素蚀之、當前位置、數(shù)組對象捷泞。

再看看使用 thisArg 的例子:


輸出結(jié)果:

a 0
b 1
c 2

不傳 thisArgs 時足删,callback 中的 this 默認指向 window 對象,當傳遞 thisArg 時锁右,callback 中的 this 就指向了 thisArg.

因此這個參數(shù)的目的就是為了改變回調(diào)函數(shù)中的this指向失受。

對于不支持 ES5 的瀏覽器讶泰,我們可以對 forEach 進行簡單的擴展來兼容老的瀏覽器:



filter( callback , [thisArg] )

filter 是`過濾`的意思,所以這個方法的作用就是返回一個匹配過濾條件的新數(shù)組贱纠,其接收兩個參數(shù) callback 和 thisArg峻厚,callback也是回調(diào)函數(shù),主要用于對元素進行條件匹配谆焊,thisArg 和 forEach中的 thisArg 作用一樣惠桃,在這里就不重復(fù)了,看下面示例:


打印newArr結(jié)果 ["a", "a"]

沒有filter的時候辖试,要實現(xiàn)這個功能辜王,我們事先要創(chuàng)建一個空的數(shù)組,把匹配到的元素再 push 進去罐孝,現(xiàn)在就不需要那么麻煩了呐馆,我們再看看對filter的擴展:


可以看出,filter 將過濾的結(jié)果作為一個新數(shù)組返回莲兢,即使符合條件的元素只有一個汹来,返回的也是數(shù)組 。為了更方便的對單個元素進行查詢改艇,ES6 在數(shù)組原型上提供了 find 方法收班,用于從數(shù)組中查詢單個符合條件的元素,和 filter 不同的是谒兄,它返回的是單個元素摔桦。

[2, 3, 5, 8, 9, 3].find(item => item == 3); // 3

需要注意的是,find 只返回第一個匹配到的元素承疲,如果沒有匹配到邻耕,則會返回 undefined 。和 filter 一樣燕鸽,find 也可以傳遞第 2 個參數(shù)兄世,用于設(shè)置回調(diào)函數(shù)的 this 指針 。



map( callback, [thisArg] )

map 的作用是對原數(shù)組進行加工處理后并將其作為一個新數(shù)組返回啊研,該方法同樣接收兩個參數(shù)御滩,callback 是回調(diào)函數(shù)用于對數(shù)組進行加工處理,thisArg 和上面的一樣悲伶。先看一個簡單的例子:


打印newArr[0] 結(jié)果:{w: 10, h: 10, area: 100}

可以看出艾恼,newArr 返回的是增加了 area 屬性的對象數(shù)組住涉。這個方法非常實用麸锉,一般情況下,當一個ajax請求返回時舆声,我們都要對其結(jié)果集進行過濾和校驗等操作花沉,這時 map 就派上用場了柳爽。我們再看看如果對 map 進行兼容性擴展:




reduce ( callback, [initialValue] )

reduce 在這里有`減少`的意思,其作用是對數(shù)組進行歸并操作碱屁,換句話說就是對數(shù)組每一個元素進行累加磷脯,最終返回所有元素之和。 回調(diào)函數(shù) callback 接收4個參數(shù):

previousValue - 存放的是上一次callback返回的結(jié)果娩脾,其初始值默認為數(shù)組的第一個元素赵誓。
currentValue - 是當前元素 。默認從數(shù)組的第二個元素開始柿赊。
currentIndex - 是當前元素位置 俩功。
array - 是當前數(shù)組。


輸出結(jié)果:

1 2 1
3 3 2
6 4 3

打印newArr ---> 10

reduce 除過可以傳遞 callback 之外碰声,還可以傳遞一個參數(shù) initialValue 诡蜓,作為數(shù)組累加的基數(shù)。當傳了這個參數(shù)以后胰挑,callback 中的 previousValue 初始值就被置為 initialValue蔓罚,reduce 也改為從數(shù)組的第一個元素開始遍歷。


輸出結(jié)果:

100 1 0
101 2 1
103 3 2
106 4 3

打印newArr ---> 110

從結(jié)果可以看出瞻颂,reduce 最終返回的是: previousValue + 數(shù)組本身歸并計算的結(jié)果豺谈。對 reduce 的 polyfill 實現(xiàn)如下:




reduceRight ( callback, [initialValue] )

和 reduce 的作用完全相同,唯一的不同是蘸朋,reduceRight 是從右至左遍歷數(shù)組的元素核无。



some ( callback, [thisArg] )

some 是`某些、一些`的意思藕坯,其作用是對數(shù)組中的每一項執(zhí)行回調(diào)函數(shù)团南,如果該函數(shù)對任一項返回 true,則停止遍歷炼彪,并返回 true 吐根。


輸出結(jié)果:

1 0 [1, 2, 3, 4]
2 1 [1, 2, 3, 4]
3 2 [1, 2, 3, 4]

打印 result ---> true

some 檢測整個數(shù)組,只要當arr中有一個元素符合條件 item>2 就停止檢測和遍歷辐马,并返回 true拷橘,以表示檢測到目標。這和我們在 for 循環(huán)中使用 break 語言的作用有點類似喜爷。

對于 some 的兼容性擴展如下:




every (callback, [thisArg])

every 是`每一個`的意思冗疮,其作用是對數(shù)組中的每一項執(zhí)行回調(diào)函數(shù),如果該函數(shù)對每一項都返回 true,則返回 true 姓赤。


輸出結(jié)果:

1 0 [1, 2, 3, 4]
2 1 [1, 2, 3, 4]
3 2 [1, 2, 3, 4]


打印result ---> false

當檢測第3個元素時示启,item<3 為 false,停止檢測诅挑,并返回 false四敞,這說明every在檢測元素時,要求每一個元素都要符合條件 item<3拔妥,如果有一個不符合就停止檢測忿危,并返回false。(你可以測試 item<5 時的運行結(jié)果没龙,返回值一定是 true ) 铺厨。

那 every 到底有什么作用呢? 當一個 for 循環(huán)使用了 break 語句后硬纤,我們想知道 for 循環(huán)是否正常的執(zhí)行完時努释, 我們一般會通過檢測for中的索引 i==arr.length 來判斷,因此every 的作用就體現(xiàn)在這里咬摇。

下面是對于 every 的兼容性擴展:




indexOf[searchElement, [fromIndex]]

indexOf() 用于查詢數(shù)組元素對應(yīng)的索引位置伐蒂,可以傳遞兩個參數(shù),第一個參數(shù)是要匹配的元素肛鹏,必須是簡單數(shù)據(jù)類型逸邦。第二個參數(shù)是指定查詢的起始位置。

// 默認從索引0的位置開始
[1, 2, 3, 5, 2].indexOf(2);// 1
// 指定從索引3的位置開始
[1, 2, 3, 5, 2].indexOf(2, 3);// 4

ndexOf() 返回的是元素在數(shù)組中的位置 在扰。如果只想知道數(shù)組中是否存在某個元素缕减,而不關(guān)心元素的位置,也可以使用 ES6 提供的 includes() 方法來判斷芒珠。

let a = [1, 2, 3];
a.includes(1);// true
a.includes(1, 1);// false


includes() 也是數(shù)組原型上的方法桥狡, 和 indexOf() 的傳參是一樣的。

需要注意的是皱卓,indexOf() 適用于數(shù)組元素是簡單類型的情況裹芝,而無法檢索對象數(shù)組的元素位置。

let arr = [{c: 1}, {c: 2}];// 對象數(shù)組
arr.indexOf({c: 1});// -1

對于這個問題娜汁,可以使用 forEach() 來遍歷數(shù)組嫂易,當找到符合條件的元素時,就可以獲取到對應(yīng)的數(shù)組下標掐禁,而在 ES6 中怜械,可以使用 findIndex() 達到同樣的目的。

findIndex() 也是用于查詢數(shù)組元素的位置傅事,和 indexOf() 不同的是缕允,它可以檢索對象數(shù)組的元素位置,但需要通過回調(diào)函數(shù)來指定匹配的元素蹭越。

//簡單數(shù)組
[1, 2, 3, 5].findIndex(item => item == 3);// 2
//對象數(shù)組
[{id: 1}, {id: 3}, {id: 5}].findIndex(item => item.id == 3);// 1



lastIndexOf[searchElement, [fromIndex]]

和 indexOf() 的作用完全相同障本,唯一的不同是,lastIndexOf() 是從右至左檢索數(shù)組元素般又。

感興趣的小伙伴彼绷,可以關(guān)注公眾號【grain先森】,回復(fù)關(guān)鍵詞 【181230】茴迁,獲取【前端教程】寄悯,更多關(guān)鍵詞玩法期待你的探索~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堕义,隨后出現(xiàn)的幾起案子猜旬,更是在濱河造成了極大的恐慌,老刑警劉巖倦卖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洒擦,死亡現(xiàn)場離奇詭異,居然都是意外死亡怕膛,警方通過查閱死者的電腦和手機熟嫩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褐捻,“玉大人掸茅,你說我怎么就攤上這事∧眩” “怎么了昧狮?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長板壮。 經(jīng)常有香客問我逗鸣,道長,這世上最難降的妖魔是什么绰精? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任撒璧,我火速辦了婚禮,結(jié)果婚禮上笨使,老公的妹妹穿的比我還像新娘沪悲。我一直安慰自己,他們只是感情好阱表,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布殿如。 她就那樣靜靜地躺著,像睡著了一般最爬。 火紅的嫁衣襯著肌膚如雪涉馁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天爱致,我揣著相機與錄音烤送,去河邊找鬼。 笑死糠悯,一個胖子當著我的面吹牛帮坚,可吹牛的內(nèi)容都是我干的妻往。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼试和,長吁一口氣:“原來是場噩夢啊……” “哼讯泣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阅悍,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤好渠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后节视,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拳锚,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年寻行,在試婚紗的時候發(fā)現(xiàn)自己被綠了霍掺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡拌蜘,死狀恐怖抗楔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拦坠,我是刑警寧澤连躏,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贞滨,受9級特大地震影響入热,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晓铆,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一勺良、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骄噪,春花似錦尚困、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滔韵,卻和暖如春逻谦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陪蜻。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工邦马, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓滋将,卻偏偏與公主長得像邻悬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子随闽,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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