不能錯過系列之生動形象解析js遍歷方法

本文解釋了forEach、filter、map、some、every、find、findIndex間的區(qū)別

前言

從最開始學(xué)的for循環(huán)遍歷方法,到后來層出不窮的各種遍歷方法,其實最大的區(qū)別就是應(yīng)用場景的不同,我們應(yīng)該做到用什么方法去應(yīng)用


展示圖片.jpg

我們從挑西瓜開始

這里有一堆西瓜,如果換成代碼,可以表示如下:

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ù)制代碼

findsome很類似,都是尋找符合條件的,有一個就可以 不過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ā)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容