日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解JS中的reduce fold unfold用法

瀏覽:286日期:2024-03-27 16:32:06
fold(reduce)

說說reduce吧, 很喜歡這個函數(shù),節(jié)省了不少代碼量,而且有一些聲明式的雛形了,一些常見的工具函數(shù),flatten,deepCopy,mergeDeep等用reduce實現(xiàn)的很優(yōu)雅簡潔。reduce也稱為fold,本質(zhì)上就是一個折疊數(shù)組的過程,把數(shù)組中的多個值經(jīng)過運算變成一個值,每次運算都會有一個函數(shù)處理,這個函數(shù)就是reduce的核心元素,稱之為reducer,reducer函數(shù)是個2元函數(shù),返回1個單值,常見的add函數(shù)就是reducer

const addReducer = (x, y) => x + y;

這個add函數(shù)就是一個reducer,最常見的用法就是結(jié)合數(shù)組的reduce方法來用

[1, 2, 3, 4, 5].reduce(addReducer, 0) // 15

為了更好的理解reduce,下面用不同的思路實現(xiàn)一遍這個函數(shù)

使用for...of

const reduce = (f, init, arr) => { let acc = init; for (const item of arr) { acc = f(acc, item); } return acc}// 執(zhí)行reduceFor(addReducer, 0, [1, 2, 3, 4, 5]) // 15使用while循環(huán)

reduce = (f, init, arr) => { let acc = init; let current; let i = 0; while ((current = arr[i++])) { acc = f(acc, current); } return acc;}// 執(zhí)行reduceFor(addReducer, 0, [1, 2, 3, 4, 5]) // 15更像fold的實現(xiàn)

上面的實現(xiàn)也都好理解,但好像沒有體現(xiàn)出來折疊(fold)這個過程,折疊應(yīng)該是對數(shù)組的層層擠壓操作,上面的實現(xiàn)數(shù)組和邏輯其實是分開了,而且也引入了比較多的中間變量,雖然是在內(nèi)部沒有副作用吧。其實換個思路想一下,如果把狀態(tài)通過參數(shù)來傳遞,就可以更好的體現(xiàn)fold的過程,這里的參數(shù)是值是指逐漸變化的數(shù)組和計算值,并可以盡可能的做到無狀態(tài),真正純函數(shù)的實現(xiàn)是沒有表達(dá)式,只有語句的,這個可以用遞歸做到。下面的實現(xiàn)是用尾遞歸實現(xiàn)的reduce,可以在實現(xiàn)的過程中就看出數(shù)組和計算值是怎樣變化的。非常符合fold這個稱謂

function reduce(f, init, arr) { if (arr.length === 0) return init; const [head, ...rest] = arr; return reduceRecursion(f, f(init, head), rest);}// 執(zhí)行reduceFor(addReducer, 0, [1, 2, 3, 4, 5]) // 15unfold

fold反過來就是unfold,unfold顧名思義就是根據(jù)一個反過來的reducer,來生成一系列的值。此時這個如果說原來的reducer實現(xiàn)類似于(a, b) -> c,那反過來就是c -> [a, b], 生成序列是一個很基本的操作,但就是這個基本的操作,也有很多實現(xiàn)的思路,在介紹unfold之前,看一下實現(xiàn)序列的其他方法,最后來做一個對比。

序列的實現(xiàn)

range(0, 100, 5)

期待結(jié)果

[0, 5, 10, ... 95]

數(shù)組實現(xiàn)

這個就不多說了,大家應(yīng)該都知道。

range = (first, last, step) => { const n = (last - first) / step + 1; return Array.from({ length: n - 1 }) .map((_, index) => first + index * step);}// 也可以使用from的第二個參數(shù)// Array.from({ length: n }, (_, i) => first + i * step);生成器實現(xiàn)

生成序列還有一個利器,那就是generator,生成器生成器,就是用來生成數(shù)據(jù)的。generator返回一個迭代器,也很容易生成序列

function* range(first, last, step) { let acc = first; while (acc < last) { yield acc; acc = acc + step; }}[...range(0, 100, 5)]

兩者相比,generator更注重生成的過程,Array注重數(shù)據(jù)變化的過程。

unfold實現(xiàn)

在實現(xiàn)unfold之前,首先梳理一下實現(xiàn)思路,和fold一樣,也是用遞歸,且要在實現(xiàn)的過程中看到對應(yīng)數(shù)據(jù)的變化。大體過程如下

0 -> [0, 5]

5 -> [5, 10]

10 -> [10, 15]

15 -> [15, 20]

...

90 -> [90, 95]

95 -> [95, 100]

可以看出過程恰恰是fold反過來,符合c -> [a, b]因為初始值肯定為一個數(shù)組,所以unfold只需要兩個參數(shù),實現(xiàn)如下。

function unfold(f, init) { const g = (f, next, acc) => { const result = f(next); const [head, last] = result || []; console.log(last); return result ? g(f, last, acc.concat(head)) : acc; }; return g(f, init, []);}range = R.curry((first, last, step) => unfold(next => next < last && [next, next + step], 0))// 執(zhí)行range(0, 100, 5)總結(jié)

以上就是結(jié)合reduce和一個生成序列的例子簡單介紹了一下fold和unfold這兩個在fp編程中很重要的概念,當(dāng)然他們功能不只是生成序列,還有很多很強(qiáng)大的功能

以上就是詳解JS中的reduce fold unfold用法的詳細(xì)內(nèi)容,更多關(guān)于JS的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产aa精品| 欧美大黑bbbbbbbbb在线| 国产精品久久久久久久久久白浆| 亚洲在线网站| 三级在线观看一区二区| 视频一区欧美精品| 国产亚洲一级| 精品资源在线| 亚洲第一精品影视| 美女国产精品| 日韩av中文字幕一区二区| 国产亚洲第一伦理第一区| 成人一区而且| 亚洲不卡av不卡一区二区| 一区二区精彩视频| 黄色在线网站噜噜噜| 午夜在线播放视频欧美| 午夜亚洲福利| 91九色精品| 日韩高清欧美激情| 理论片午夜视频在线观看| 国产日韩专区| 蜜桃久久久久| 美国三级日本三级久久99 | 日韩精品午夜| 美女久久一区| 国产成人免费精品| 蜜桃久久久久久| 国产精选在线| 日韩成人精品一区二区三区 | 国产福利亚洲| 婷婷精品进入| 麻豆一区二区99久久久久| 亚洲欧美日韩视频二区| 久久wwww| 亚洲精品麻豆| 亚洲美女久久精品| 国产日韩中文在线中文字幕| 国产精品成人a在线观看| 亚洲精品三级| 欧美va亚洲va日韩∨a综合色| 国产欧美日韩在线观看视频| 亚洲天堂久久| 精品视频在线你懂得| 久久午夜精品| 欧美日韩在线网站| 麻豆精品少妇| 日韩在线黄色| 日本在线不卡视频| 欧美一区三区| 日韩精品看片| 精品捆绑调教一区二区三区| 伊人久久视频| 国产成人精品福利| 久久免费精品| 美女精品视频在线| 久久国产日韩欧美精品| 女人av一区| 播放一区二区| 日韩不卡免费高清视频| 成人在线视频中文字幕| 欧美黄页在线免费观看| 欧美一区二区三区久久精品| 亚洲人成亚洲精品| 亚洲+小说+欧美+激情+另类| 中文字幕一区日韩精品| 日韩激情啪啪| 国产精品一国产精品| 国产日韩中文在线中文字幕| 欧美一区成人| av中文资源在线资源免费观看| 久久精品一区二区三区中文字幕| 日韩福利视频导航| 国产精品115| 久久精品国产亚洲夜色av网站| 久久精品91| 久久福利影视| 日韩精品91亚洲二区在线观看| 日本视频在线一区| 精品久久视频| 激情偷拍久久| 一区二区国产精品| 欧美aⅴ一区二区三区视频| а√天堂中文在线资源8| 香蕉精品视频在线观看| 免费在线欧美视频| 欧美成人精品一级| 97人人精品| 99在线观看免费视频精品观看| 亚洲精品一级| 中文字幕在线视频久| 在线精品一区二区| 国产在视频一区二区三区吞精| 美女少妇全过程你懂的久久| 亚洲精品黄色| 欧美 日韩 国产精品免费观看| 日韩在线电影| 亚洲国产不卡| 日韩欧美少妇| 日韩精品一级| 欧美在线资源| 国产a久久精品一区二区三区| 亚洲欧美一区在线| 精品视频久久| 欧美日韩一视频区二区| 欧美精品一二| 九九久久国产| 欧美精品中文字幕亚洲专区| 国产亚洲激情| 99久久亚洲精品蜜臀| 麻豆精品一区二区综合av| 亚洲精品国产日韩| 亚洲欧美不卡| 国产免费成人| 在线亚洲免费| 亚洲精品国产偷自在线观看| 国产麻豆久久| 成人午夜网址| 日本一二区不卡| 美女尤物国产一区| 国产精品一区二区中文字幕| 日韩欧美久久| 亚洲ab电影| 欧美亚洲三级| 国产欧美69| 欧美a级一区二区| 国产成人免费av一区二区午夜| 久久精品国产免费| 国产在视频一区二区三区吞精| 精品视频一区二区三区在线观看| 精品视频在线一区二区在线| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 日韩理论片av| sm捆绑调教国产免费网站在线观看| 精品久久一区| 久久久久久久久久久妇女| 尤物tv在线精品| 丝袜美腿一区二区三区| 日韩精品五月天| 国产精品一区三区在线观看| 国产精品一区二区av日韩在线| 国产精品mm| 群体交乱之放荡娇妻一区二区| 久久视频国产| 欧美中文日韩| 国产精品主播| 久久精品国内一区二区三区水蜜桃| 欧美日韩国产欧| 91欧美日韩在线| 欧美黄色网页| 视频一区二区三区入口| 免费视频一区二区三区在线观看| 久久久久国产精品一区三寸| 免费不卡在线观看| 国产乱子精品一区二区在线观看 | 成人一区不卡| 美女久久网站| 国产一区二区精品久| 宅男噜噜噜66国产日韩在线观看| 欧美日韩亚洲一区三区| 视频福利一区| 欧美精品二区| 国产精品毛片一区二区三区| 国产精品久久久久久模特| 波多野结衣一区| 久久精品五月| 亚洲区欧美区| 久久亚洲专区| 精品久久美女| 国产日韩亚洲欧美精品| 最新亚洲激情| 欧美香蕉视频| 精品视频一区二区三区在线观看| 中文字幕av一区二区三区人| 久久精品av| 国产资源在线观看入口av| 国产精品亚洲欧美日韩一区在线| 久久亚洲色图| 好吊日精品视频| 私拍精品福利视频在线一区| 国产一区二区三区亚洲综合| 日本vs亚洲vs韩国一区三区二区| 欧美国产91| 久久亚洲专区| 激情婷婷久久| 黄色成人91| 香蕉国产精品| 9色精品在线| 日韩午夜av| 日韩中文字幕区一区有砖一区| 在线 亚洲欧美在线综合一区| 亚洲一级特黄| 久久国产精品亚洲77777| 99国产精品视频免费观看一公开| 欧美大黑bbbbbbbbb在线| 亚洲国产成人精品女人| 亚洲大片在线| 99国产成+人+综合+亚洲欧美| 在线一区免费观看| 亚洲2区在线|