一、前言
ES5中新增的一些處理數組(Array)的方法, 對於用JavaScript處理數據非常有用。我總結了一下,給這些方法分了類,大體如下:
2個索引方法:indexOf() 和 lastIndexOf();
5個迭代方法:forEach()、map()、filter()、some()、every();
2個歸並方法:reduce()、reduceRight();
下面我們來具體看一看這些方法怎么用吧!
二、索引方法
索引方法包含indexOf()和lastIndexOf()兩個方法,這兩個方法都接收兩個參數,第一個參數是要查找的項,第二個參數是查找起點位置的索引,該參數可選,如果缺省或是格式不正確,那么默認為0。兩個方法都返回查找項在數組中的位置,如果沒有找到,那么返回-1。區別就是一個從前往后找,一個從后往前找。
讓我們來看一個具體列子吧,首先定義一個數組:
var dataArray = [1, 7, 5, 7, 1, 3];
indexOf():該方法從數組的開頭開始向后查找。
console.log(dataArray.indexOf(7)); // 1 缺省, 從第一項開始查找 console.log(dataArray.indexOf(7, 's')); // 1 格式不正確, 從第一項開始查找 console.log(dataArray.indexOf(7, 2)); // 3 從第三個項之后開始查找 console.log(dataArray.indexOf (2)); // -1 未找到, 返回-1
lastIndexOf(): 該方法從數組的末尾開始向前查找。
console.log(dataArray.lastIndexOf (7)); // 3 缺省, 從末尾第一項開始查找 console.log(dataArray.lastIndexOf (7, 's')); // 3 格式不正確, 從末尾第一項開始查找 console.log(dataArray.lastIndexOf (7, 2)); // 1 從末尾第三項往前查找 console.log(dataArray.lastIndexOf ('4')); // -1 未找到, 返回-1
值得注意的是,在比較第一個參數與數組中的每一項時,會使用全等操作符, 要求必須完全相等,否則返回-1。
console.log(dataArray .lastIndexOf ('7')); // -1,因為這里是字符串,並不是數值類型
三、迭代方法
迭代方法包含some()、every()、filter()、map()和forEach()五個方法,這些方法都接收兩個參數,第一個參數是一個函數,他接收三個參數,數組當前項的值、當前項在數組中的索引、數組對象本身。第二個參數是執行第一個函數參數的作用域對象,也就是上面說的函數中this所指向的值。注意,這幾種方法都不會改變原數組。
every()和some()方法有些類似,我們放在一起比較。
every():該方法對數組中的每一項運行給定函數,如果該函數對每一項都返回 true,則返回true。
some(): 該方法對數組中的每一項運行給定函數,如果該函數對任何一項返回 true,則返回true。
感覺有點繞,我們來對着例子講一講。
首先我們來看一下every方法,數組中的每一項都會執行給定的函數,如果數組中每一項執行該函數都返回true,那么我們結果返回true,否則返回false。
下面例子中,當我們設置item > 1時,第一項和第五項不符合,所以最終結果返回false。
下面例子中,當我們設置item > 0時,所有項都符合,那么我們最終結果為true。

接下來我們來看some方法,數組中的每一項都會執行給定的函數,只要有一項為true,那么結果結果為true。
下面這個例子,當我們設置item > 5時,第二項就符合,我們直接返回true。
而且值得注意的是,some方法會在數組中任一項執行函數返回true之后,不在進行循環。
下面例子中,我們設置item > 5,當數組中第二項7大於5時,停止循環,直接返回結果。

filter() :該方法對數組中的每一項運行給定函數,返回該函數會返回 true 的項組成的數組。利用這個方法可對數組元素進行過濾篩選。
我們來看下面的例子,當我們設置item > 3時,數組中2、3、4像返回組成了一個新數組。
而且我們可以看出,當我們分別設置item > 3和item > '3'時, 返回的結果是一樣的,由此我們可以看出函數支持弱等於(==),不是必須全等於(===)。

和filter() 方法類似,jquery中有個grep()方法也用於數組元素過濾篩選。
下面例子中,當我們設置item > 3時,返回的數組和我們用filter方法是一樣的。

grep(array, function[, invert])方法,還有一個特性,當invert缺省或是為false,和filter方法一樣,正常過濾出符合條件的數組元素,當invert值為true, 正好相反,他會過濾出函數返回值為false的數組元素。
我們來看下面的例子,當設置了invert參數為true之后,函數返回如下過濾后的數組。

map(): 該方法對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組。
我們來看下面的例子,我們為數組中的每一項乘以3,返回每一項相乘之后的數組。

我們接下來定義一個航班數組,每次返回該數組元素的航空公司,組成新數組。

forEach(): 該方法對數組中的每一項運行給定函數。這個方法沒有返回值。這個方法其實就是遍歷循環,和for循環沒有太大差別。jquery()也提供了相應的方法each()方法。
下面的例子我們依次進行for循環、forEach方法、each方法的調用,最終執行結果相同。

四、歸並方法
歸並方法包含reduce()和reduceRight()兩個方法,這兩個方法都會迭代數組中的所有項,然后生成一個最終返回值。他們都接收兩個參數,第一個參數是每一項調用的函數,函數接受是個參數分別是初始值,當前值,索引值,和當前數組,函數需要返回一個值,這個值會在下一次迭代中作為初始值。第二個參數是迭代初始值,參數可選,如果缺省,初始值為數組第一項,從數組第一個項開始疊加,缺省參數要比正常傳值少一次運算。
reduce():該方法從數組的第一項開始,逐個遍歷到最后一項。
這個方法比較復雜,我們來看一個例子
代碼如下:

具體看這個代碼,首先我們在傳入reduce的函數中打印了prev值,可以看到prev就是數組每兩項的和。比如第一個是1,第二個就是1+7 = 8,以此類推。
最后,我們把結果返回給了sum,那sum自然就是數組的每一項之和。這是沒設置第二個參數的情況。
下面我們來看看設置了第二個參數為2的例子。

我們可以看出,當設置了第二個參數。我們第一個prev輸出的結果就是第二個參數的值。設置了這個參數,會多執行一次。
利用這種方法,我們可以快速的把二維數組轉化為一維數組。

顧名思義,reduceRight()就是從右到左,就不詳細說了。
五、兼容性問題
ES5里這些處理數組的新方法,在IE6-IE8瀏覽器還未得到支持,所以我們需要在IE這些低版本瀏覽器中引入這個es5-shim補丁,這樣我們就可以使用它了。
補丁地址:https://github.com/es-shims/es5-shim
本博客文章皆為原創,未盡許可,請勿轉載 (http://www.cnblogs.com/song-song/p/5329374.html)
