本文解釋了forEach、filter、map、some、every、find、findIndex間的區(qū)別
前言
從最開始學(xué)的for循環(huán)遍歷方法,到后來層出不窮的各種遍歷方法,其實最大的區(qū)別就是應(yīng)用場景的不同,我們應(yīng)該做到用什么方法去應(yīng)用

我們從挑西瓜開始
這里有一堆西瓜,如果換成代碼,可以表示如下:
var potatos = [{ id: '1001', weight: 50 },
{ id: '1002', weight: 80 },
{ id: '1003', weight: 120 },
{ id: '1004', weight: 40 },
{ id: '1005', weight: 110 },
{ id: '1006', weight: 60 }]
同時把上面的重量(weight)記錄成一個數(shù)組
var w = [50, 80, 120, 40, 110, 60]
農(nóng)民:我要催熟(批量操作)
我們希望把這一批西瓜全部催熟一下,進(jìn)行增重 可以用到forEach方法
potatos.forEach(potato => potato.weight += 50 )
map方法說:我也可以!
potatos.map(potato => potato.weight +=50 )
map補(bǔ)充了一句,我還可以把重量統(tǒng)計表格,更新出一份新的給你
w = potatos.map(potato =>
{ return potato.weight +=50 })
//[ 100, 130, 170, 900, 160, 110 ]
forEach和map的最大區(qū)別就在于,forEach沒有返回值。 即便你給forEach加上return也沒用
w = potatos.forEach(potato =>
{ return potato.weight +=50 })
//undefined
顧客:我只要大西瓜(篩選過濾)
filter是濾波的意思 從名字上看,就知道篩選過濾這樣的活是filter來干的
var bigOnes = potatos.filter(potato => { return potato.weight > 100 })
//[ { id: '1003', weight: 120 }, { id: '1005', weight: 110 } ]
返回一個新的對象數(shù)組,并不會改變原數(shù)組
商販:你這有沒有大的啊(找一找有沒有符合條件的吧)
得找個有代表性的,一看就知有沒有啦
當(dāng)只需要判斷數(shù)組中有沒有符合條件的時候(一個就行) 就需要我們的some方法登場了
var hasbig = potatos.some(potato => { return potato.weight > 100 })
//true
我們的some小伙計,去西瓜存放的倉庫進(jìn)行尋找,只要找到一個符合條件的,就回來報告true所以并不會全部遍歷,不做多余的活(性能優(yōu)良)
商販:難道全都是大的嗎(全符合)
我不信你這全是大的 派了個every小伙計去檢查
var allbig = potatos.every(potato => { return potato.weight > 100 })
//false
every對每一個元素執(zhí)行一個callback,直到它找到一個使 callback 返回 false的元素(沒那么大的西瓜),就返回false,直到遍歷完成也沒有返回false的話,就返回true
顧客:給我個大西瓜(返回一個符合的)
來了一個顧客,想要一個大西瓜 find自告奮勇,我去找給他
var big = potatos.find(potato => { return potato.weight > 100 })
//{ id: '1003', weight: 120 }
復(fù)制代碼
find和some很類似,都是尋找符合條件的,有一個就可以 不過some進(jìn)去搜羅了一圈回來報了個“有”(true),而find則把那個西瓜抱了出來(返回第一個符合條件的對象)
收銀員:這西瓜是倉庫的第幾個來著(返回序號)
老板賣完準(zhǔn)備記錄一下
“哎,這西瓜是倉庫的第幾個?” find說:“哎呀我光顧著抱西瓜了,沒看是第幾個”
“早知道讓findIndex跟你一起去了”
var i = potatos.findIndex(potato=>{ return potato.weight > 100 })
//2
當(dāng)需要知道所需元素的索引,就可以用findIndex
findIndex返回第一個符合條件的索引號
老板:今天的總共賣出了多少斤西瓜?看看銷量,決定下次進(jìn)貨量!
reduce說:那不得我來么
var sum = w.reduce((prev, cur) => { return prev + cur});
//460
reduce()方法接收一個回調(diào)函數(shù)作為第一個參數(shù),回調(diào)函數(shù)又接受四個參數(shù),分別是;
1、previousValue =>初始值或上一次回調(diào)函數(shù)疊加的值;
2、currentValue => 本次回調(diào)(循環(huán))將要執(zhí)行的值;
3、index=>“currentValue”的索引值;
4、arr => 數(shù)組本身;
reduce()方法返回的是最后一次調(diào)用回調(diào)函數(shù)的返回值;
本文參照https://juejin.im/post/5d08467fe51d451063431814
這篇文章用西瓜的案例,是不是很有趣啊,希望能給大家一點(diǎn)啟發(fā)~