在 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)鍵詞玩法期待你的探索~