电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解JS中的reduce fold unfold用法

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

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

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

這個add函數就是一個reducer,最常見的用法就是結合數組的reduce方法來用

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

為了更好的理解reduce,下面用不同的思路實現一遍這個函數

使用for...of

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

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

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

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

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

序列的實現

range(0, 100, 5)

期待結果

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

數組實現

這個就不多說了,大家應該都知道。

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

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

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

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

unfold實現

在實現unfold之前,首先梳理一下實現思路,和fold一樣,也是用遞歸,且要在實現的過程中看到對應數據的變化。大體過程如下

0 -> [0, 5]

5 -> [5, 10]

10 -> [10, 15]

15 -> [15, 20]

...

90 -> [90, 95]

95 -> [95, 100]

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

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))// 執行range(0, 100, 5)總結

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

以上就是詳解JS中的reduce fold unfold用法的詳細內容,更多關于JS的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 电动高尔夫球车|电动观光车|电动巡逻车|电动越野车厂家-绿友机械集团股份有限公司 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 深圳货架厂家_金丽声精品货架_广东金丽声展示设备有限公司官网 | 发电机组|柴油发电机组-批发,上柴,玉柴,潍柴,康明斯柴油发电机厂家直销 | 防水套管|柔性防水套管|伸缩器|伸缩接头|传力接头-河南伟创管道 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 冷油器-冷油器换管改造-连云港灵动列管式冷油器生产厂家 | 光谱仪_积分球_分布光度计_灯具检测生产厂家_杭州松朗光电【官网】 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 船用锚链|专业锚链生产厂家|安徽亚太锚链制造有限公司 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 浩方智通 - 防关联浏览器 - 跨境电商浏览器 - 云雀浏览器 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 浙江浩盛阀门有限公司| 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 保镖公司-私人保镖-深圳保镖公司【环宇兄弟保镖】 | 不锈钢监控杆_监控立杆厂家-廊坊耀星光电科技有限公司 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 盐城网络公司_盐城网站优化_盐城网站建设_盐城市启晨网络科技有限公司 | 底部填充胶_电子封装胶_芯片封装胶_芯片底部填充胶厂家-东莞汉思新材料 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 |