摘要:例使用多個(gè)類別所以如果這都是關(guān)于卡路里的,為什么會(huì)有這么多不同的飲食呢我不打算深究營(yíng)養(yǎng)科學(xué),但這里有一個(gè)概括性的總結(jié)對(duì)于最佳減肥方法有很多分歧。
想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你!
JavaScript中的reduce方法為您提供了一種簡(jiǎn)單的方法來(lái)獲取值數(shù)組并將它們組合成一個(gè)值,或者根據(jù)多個(gè)類別對(duì)數(shù)組求和。
哇,一句話說(shuō)得太多了,讓我們一步一步來(lái)吧!
當(dāng)然,你可以使用 for 循環(huán)遍歷數(shù)組并對(duì)每個(gè)值執(zhí)行特定操作。但是,如果你不使用 filter()、map() 和reduce() 等方法,那么你的代碼將變得更加難以閱讀。其他開發(fā)人員需要徹底閱讀每個(gè)循環(huán)才能理解其目的,而且容易出現(xiàn)更多的 bug,因?yàn)槟阈枰獎(jiǎng)?chuàng)建更多的變量來(lái)跟蹤單個(gè)值。
Filter 方法接受初始數(shù)組中的所有元素,并且只允許某些元素進(jìn)入最終數(shù)組
Map 方法在初始數(shù)組中的每個(gè)元素上運(yùn)行一個(gè)函數(shù),然后將其存儲(chǔ)在最終數(shù)組中。
而 reduce 方法將初始數(shù)組中的元素組合成最終值或值數(shù)組。
我意識(shí)到這有點(diǎn)像節(jié)食。從非常簡(jiǎn)單的方法,如計(jì)算卡路里,到更復(fù)雜的飲食,如 Atkins 減肥法或稱體重計(jì)(WeightWatchers),目標(biāo)是將你一天中可能吃的所有食物提煉成一個(gè)(或多個(gè))值,看看你是否在減肥的軌道上。
用 For 循環(huán)模擬Reduce下面是使用for循環(huán)快速顯示reduce()功能的方法。假設(shè)你有一個(gè)包含你一天中吃過(guò)的5種不同食物的卡路里計(jì)數(shù)的數(shù)組,你想知道你總共消耗了多少卡路里,代碼如下:
這很簡(jiǎn)單,你創(chuàng)建一個(gè)變量來(lái)保存最終數(shù)量,然后在運(yùn)行數(shù)組時(shí)添加它。但是,你仍然需要引入一個(gè)新變量,并且循環(huán)沒有提供關(guān)于循環(huán)目的的線索。
一個(gè)簡(jiǎn)單的Reduce示例讓我們學(xué)習(xí)如何使用reduce()方法實(shí)現(xiàn)相同的目標(biāo)。
reduce() 方法接收一個(gè)函數(shù)作為累加器,數(shù)組中的每個(gè)值(從左到右)開始縮減,最終計(jì)算為一個(gè)值。對(duì)空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。
所以 reduce 有一些內(nèi)存的概念。在遍歷數(shù)組中的每一項(xiàng)時(shí),sum參數(shù)將跟蹤值。在前面的例子中,我們必須在循環(huán)范圍之外聲明一個(gè)新變量來(lái)“記住”這些值。
這與for()之間的可讀性似乎沒有太大區(qū)別。但是,當(dāng)需要遍歷數(shù)百行代碼時(shí),reduce 會(huì)讓你快速了解代碼塊的用途。
例2 - 使用對(duì)象到目前為止,我們只舉例一維數(shù)組。但是,如果您可以遍歷一個(gè)都是數(shù)字的數(shù)組,那么你也可以遍歷一個(gè)都是對(duì)象的數(shù)組。讓我們給每個(gè)元素加一個(gè)名字,這樣我們就能知道我們一天到底吃了什么。
你早餐吃了一份牛排,一些水果,然后午餐吃了一些沙拉和薯?xiàng)l,最后晚餐吃了冰淇淋,真是糟糕的一天!
希望你們能看到整個(gè)數(shù)組的流動(dòng)。當(dāng)我們研究每一種元素時(shí),總熱量的總和( sum)就代表了一天所消耗的總熱量,主要是把這些數(shù)值放進(jìn)一個(gè)大桶里——一天的卡路里量。
例3 - 使用多個(gè)類別所以如果這都是關(guān)于卡路里的,為什么會(huì)有這么多不同的飲食呢? 我不打算深究營(yíng)養(yǎng)科學(xué),但這里有一個(gè)概括性的總結(jié)——對(duì)于 “最佳” 減肥方法有很多分歧。有些人鼓勵(lì)你只計(jì)算卡路里,而另一些人則關(guān)注蛋白質(zhì)、碳水化合物、脂肪和其他任何因素。
讓我們?cè)O(shè)想一下,你希望更改代碼,以便能夠基于任何常見的節(jié)食系統(tǒng)評(píng)估您的飲食。你需要追蹤每種食物的碳水化合物和脂肪,然后你需要在最后統(tǒng)計(jì)一下,這樣你就能算出你在每個(gè)類別中消耗了多少克,以下我們的食品(有虛假的營(yíng)養(yǎng)價(jià)值):
現(xiàn)在,我們需要運(yùn)行reduce()方法。但是,它不能在一個(gè)值中被跟蹤,我們想保留我們的類別。因此,我們的累加器需要是一個(gè)與數(shù)組具有相同類型的對(duì)象。
下面是這個(gè)過(guò)程的一個(gè)GIF圖片:
在遍歷數(shù)組每個(gè)項(xiàng)時(shí),你將更改對(duì)象中特定屬性的值,如果該對(duì)象尚未具有正確名稱的屬性,則將創(chuàng)建該對(duì)象,如下:
我們使用 bucket 作為對(duì)象,根據(jù)屬性名對(duì)值進(jìn)行分類。我們使用 += 操作符為來(lái)自 foods 數(shù)組的對(duì)象中的每個(gè)值添加到適當(dāng)?shù)腷ucket。請(qǐng)注意保存值的 key 的名字,這里是隨意的,這是因?yàn)樗菬o(wú)關(guān)緊要的——我們只是想要數(shù)字,這樣我們就可以分析你一天飲食的成功。
如你所見,在我們的輸出中有一個(gè)問(wèn)題,結(jié)果包含一個(gè) name 字段為“steak”,我們并不想存儲(chǔ)該字段。因此,我們需要指定另一個(gè)參數(shù)——初始值。
這個(gè)參數(shù)在回調(diào)之后出現(xiàn),我們希望將 calories、carbs 和 fat 字段初始化為0,以便我們的 reduce 方法知道這是我們將用于 bucket 參數(shù)的唯一三個(gè)鍵/值對(duì),代碼如下:
原文:https://codeburst.io/javascri...
你的點(diǎn)贊是我持續(xù)分享好東西的動(dòng)力,歡迎點(diǎn)贊!
歡迎加入前端大家庭,里面會(huì)經(jīng)常分享一些技術(shù)資源。文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/100026.html
摘要:簡(jiǎn)單例子一個(gè)較為常用的場(chǎng)景就是累加或累乘輸出數(shù)組元素的乘積輸出數(shù)組元素的乘積簡(jiǎn)寫形式輸出數(shù)組元素的乘積形式,營(yíng)造復(fù)雜的逼格用在數(shù)組降維扁平化處理的例子中注方法用于連接兩個(gè)或多個(gè)數(shù)組。 看到一個(gè)提問(wèn)的回答巧妙地使用了map/reduce操作,很優(yōu)雅,所以來(lái)學(xué)習(xí)和總結(jié)一下javascript自帶的map/reduce的使用技巧,文章不會(huì)講的很深,純當(dāng)科普一下知識(shí)點(diǎn),如有解釋的不正確的地方,...
摘要:過(guò)程是一個(gè)計(jì)算單元,計(jì)算是通過(guò)通訊來(lái)完成的。標(biāo)題的表達(dá)式里還有一個(gè)符號(hào),表示一個(gè)無(wú)行為的過(guò)程。一個(gè)過(guò)程的是它和外部產(chǎn)生行為交互的唯一方式。所以如果兩個(gè)過(guò)程需要通過(guò)一個(gè)交互,這個(gè)必須在兩個(gè)過(guò)程中都是,其中一方用于發(fā)送,另一方用于接收。 這篇文章的標(biāo)題是一個(gè)π表達(dá)式,結(jié)尾是一段JavaScript代碼,和這個(gè)表達(dá)式的含義完全一致,或者說(shuō),完成了這個(gè)表達(dá)式的估值。 π演算(π calculu...
摘要:原文鏈接原文作者函數(shù)式編程這篇文章是介紹函數(shù)式編程的四篇文章中的第二篇。這些部分被使用的越來(lái)越頻繁,人們把他們放到一個(gè)函數(shù)式編程的庫(kù)里面,有一些流行的庫(kù)包括未亡待續(xù)閱讀下一節(jié)原文地址歡迎關(guān)注 showImg(https://segmentfault.com/img/bVtSez); tips 原文鏈接: http://jrsinclair.com/articles/2016/gentl...
摘要:該方法接受兩個(gè)參數(shù),一個(gè)是元素每一項(xiàng)執(zhí)行的回調(diào)函數(shù),一個(gè)是可選參數(shù),回調(diào)函數(shù)運(yùn)行時(shí)的值。 今天我們來(lái)繼續(xù) Javascript 數(shù)組系列的文章,上文 《Javascript數(shù)組系列二之迭代方法1》 我們說(shuō)到一些數(shù)組的迭代方法,我們?cè)陂_發(fā)項(xiàng)目實(shí)戰(zhàn)的過(guò)程中熟練的使用可以大大提高我們的開發(fā)效率以及數(shù)據(jù)的處理。接下來(lái)我們繼續(xù)來(lái)講解其他的一些迭代的方法。 天也黑了,時(shí)間也不早了,話不多說(shuō),擼起袖...
摘要:循環(huán)數(shù)組每一項(xiàng)數(shù)組下標(biāo)當(dāng)前調(diào)用數(shù)組本身可選初始值,作為回調(diào)函數(shù)第一個(gè)參數(shù)的默認(rèn)值,也是每次回調(diào)的返回值,見代碼首頁(yè)問(wèn)題轉(zhuǎn)化為數(shù)組首頁(yè)問(wèn)題轉(zhuǎn)化后效果這個(gè)栗子來(lái)自配置路由時(shí)遇到的,當(dāng)時(shí)也是優(yōu)化了好幾個(gè)版本。 reduce callback(一個(gè)在數(shù)組中每一項(xiàng)上調(diào)用的函數(shù),接受四個(gè)參數(shù):)previousValue(上一次調(diào)用回調(diào)函數(shù)時(shí)的返回值,或者初始值)currentValue(當(dāng)前正...
閱讀 1802·2023-04-26 00:47
閱讀 1552·2021-11-11 16:55
閱讀 2623·2021-09-27 14:04
閱讀 3560·2021-09-22 15:58
閱讀 3561·2021-07-26 23:38
閱讀 2137·2019-08-30 13:47
閱讀 1987·2019-08-30 13:15
閱讀 1151·2019-08-29 17:09