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

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

JS數組Reduce方法功能與用法實例詳解

瀏覽:170日期:2024-05-10 18:02:58

本文實例講述了JS數組Reduce方法功能與用法。分享給大家供大家參考,具體如下:

概述

一直以來都在函數式編程的大門之外徘徊,要入門的話首先得熟悉各種高階函數,數組的reduce方法就是其中之一。

reduce方法將會對數組元素從左到右依次執行reducer函數,然后返回一個累計的值。舉個形象的例子:你要組裝一臺電腦,買了主板、CPU、顯卡、內存、硬盤、電源...這些零件是組裝電腦的必要條件。

裝的過程可以簡單概括為拆掉每個零件的包裝,再裝到一起。類比一下reduce函數就可以明白了,那些零件就相當于要執行reduce方法的數組,對每個零件執行拆除包裝的加工程序,就是對數組的每個元素執行reducer函數,把這些零件裝到一起,就相當于reduce方法的任務,最終組裝好的電腦相當于reduce方法的返回值。

reduce方法接收兩個參數,第一個參數是回調函數reducer,第二個參數是初始值。reducer函數接收四個參數:

Accumulator:MDN上解釋為累計器,但我覺得不恰當,按我的理解它應該是截至當前元素,之前所有的數組元素被reducer函數處理累計的結果 Current:當前被執行的數組元素 CurrentIndex: 當前被執行的數組元素索引 SourceArray:原數組,也就是調用reduce方法的數組

如果傳入第二個參數,reduce方法會在這個參數的基礎上開始累計執行。

概念講了那么多,那reduce它的執行機制是怎樣的呢?別著急,從用法入手一點一點分析。

來個最好理解的例子:數組求和

const arr = [1, 2, 3, 4] const accumulator = (total, current, currentIndex, arr) => { console.log(total, current, currentIndex, arr); return total + current } console.log(arr.reduce(accumulator))

執行結果如下:

JS數組Reduce方法功能與用法實例詳解

很明確,最終的結果就是把所有數組的元素都加起來。值得注意的是,它將數組的第一個元素作為累加的初始值,然后再依次對后邊的元素執行reducer函數。

總共執行了三次,得出最終結果。那如果傳入初始值,是怎樣的執行順序?

console.log(arr.reduce(accumulator, 3))

結果如下:

JS數組Reduce方法功能與用法實例詳解

這次是以傳入的初始值作為累加的起點,然后依次對數組的元素執行reducer。

假設對沒有初始值的空數組調用reduce方法,則會報錯:

Uncaught TypeError: Reduce of empty array with no initial value

一些用法

講了一些概念,但使用場景更重要,下面來看一下reduce方法都會有哪些用途。

compose函數

compose是函數式編程的一種形式,用于將多個函數合并,上一個函數的返回值作為當前函數的入參,當前函數的返回值再作為下一個函數的入參,這樣的效果有點類似于koa中間件的洋蔥模型。

[a, b, c, d] => a(b(c(d())))

實際上和累加差不多,只不過把累加操作變成了入參執行,相加的結果變成了執行的返回值。redux的applyMiddleware內就使用了compose,目的是保證最終的dispatch是被所有中間件處理后的結果。

下面來以applyMiddleware中的compose為例,先看用法:

const result = compose(a, b, c)(params)

執行情況是這樣:

(params) => a(b(c(params)))

返回的是一個函數,將params作為該函數的入參,被右側第一個函數執行,執行順序是從右到左執行,其余的函數的參數都是上一個函數的返回值。

看一下實現:

function compose(...funcs) { // funcs是compose要組合的那些函數,arg是componse返回的函數的參數 if (funcs.length === 0) { // 如果沒有傳入函數,那么直接返回一個函數,函數的返回值就是傳進來的參數 return arg => arg } if (funcs.length === 1) { // 如果只傳入了一個函數,直接返回這個函數 return funcs[0] } return funcs.reduce((all, current) => { return (...args) => { return all(current(...args)) } })}扁平化數組

const array = [[0, 1], [2, 3], [4, 5]]const flatten = arr => { return arr.reduce((a, b) => { return a.concat(b) }, [])}console.log(flatten(array)); // [0, 1, 2, 3, 4, 5]

來看一下執行過程,

第一次執行,初始值傳入[],走到reduce的回調里,參數a就這個[],參數b是數組第一項[0, 1],回調內[].cancat([0, 1]) 第二次執行,reduce的回調參數a是上一次回調執行的結果[0, 1],本次繼續用它來concat數組的第二項[2, 3],得到結果[0, 1, 2, 3]作為下一次回調執行的參數a繼續執行下去 ...以此類推

那么假設數組是這樣呢?[[0, [111, 222], 1], [2, [333, [444, 555]], 3], [4, 5]],其實加個遞歸調用就可以

const array = [[0, [111, 222], 1], [2, [333, [444, 555]], 3], [4, 5]]const flatten = arr => { return arr.reduce((a, b) => { if (b instanceof Array) { return a.concat(flatten(b)) } return a.concat(b) }, [])}console.log(flatten(array)); // [0, 111, 222, 1, 2, 333, 444, 555, 3, 4, 5]統計字符串中每個字符出現的次數

每次回調執行的時候,都會往對象中加一個key為字符串,value為出現次數的鍵值,若已經存儲過字符串,那么它的value加1。

const str = ’adefrfdnnfhdueassjfkdiskcddfjds’const arr = str.split(’’)const strObj = arr.reduce((all, current) => { if (current in all) { all[current]++ } else { all[current] = 1 } return all}, {})console.log(strObj)// {'a':2,'d':7,'e':2,'f':5,'r':1,'n':2,'h':1,'u':1,'s':4,'j':2,'k':2,'i':1,'c':1}數組去重

const arr = [’1’, ’a’, ’c’, ’d’, ’a’, ’c’, ’1’]const afterUnique = arr.reduce((all, current) => { if (!all.includes(current)) { all.push(current) } return all}, [])console.log(afterUnique); // ['1', 'a', 'c', 'd']按照順序調用promise

這種方式實際上處理的是promise的value,將上一個promise的value作為下一個promise的value進行處理。

const prom1 = a => { return new Promise((resolve => { resolve(a) }))}const prom2 = a => { return new Promise((resolve => { resolve(a * 2) }))}const prom3 = a => { return new Promise((resolve => { resolve(a * 3) }))}const arr = [prom1, prom2, prom3]const result = arr.reduce((all, current) => { return all.then(current)}, Promise.resolve(10))result.then(res => { console.log(res);})實現

通過上面的用法,可以總結出來reduce的特點:

接收兩個參數,第一個為函數,函數內會接收四個參數:Accumulator Current CurrentIndex SourceArray,第二個參數為初始值。 返回值為一個所有Accumulator累計執行的結果

Array.prototype.myReduce = function(fn, base) { if (this.length === 0 && !base) { throw new Error(’Reduce of empty array with no initial value’) } for (let i = 0; i < this.length; i++) { if (!base) { base = fn(this[i], this[i + 1], i, this) i++ } else { base = fn(base, this[i], i, this) } } return base }

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品久久久免费| 久久久久九九精品影院| 欧美aⅴ一区二区三区视频| 日韩精品网站| 精品一区二区三区中文字幕视频 | 国产精品一区二区三区av麻| 亚洲免费网址| 欧美成人综合| 国产亚洲亚洲| 蜜臀av一区二区在线免费观看| 欧美日中文字幕| 国产精品久久久久久久久妇女| 精品五月天堂| 韩国久久久久久| 九一成人免费视频| 美日韩精品视频| 亚洲va久久| 鲁大师精品99久久久| 97精品国产| 午夜视频精品| 蜜臀久久久99精品久久久久久| 亚洲精品三级| 国产一区二区三区四区五区传媒| 欧美国产免费| 人人香蕉久久| 日韩欧美2区| 欧美精品国产| 亚洲播播91| 亚洲精品一级| 麻豆成全视频免费观看在线看| 亚洲二区三区不卡| 日韩精品三区四区| 97精品中文字幕| 午夜在线一区二区| 国产亚洲一卡2卡3卡4卡新区| 久久久久久自在自线| 日韩在线一二三区| 国产aa精品| 亚洲综合中文| 久久精品卡一| 久久精品国产亚洲aⅴ| 999国产精品999久久久久久| 日韩精品国产欧美| 91精品成人| 红桃视频国产一区| 日韩av专区| 欧美a在线观看| 日韩av电影一区| 亚洲一区二区三区四区电影 | 日韩精品免费观看视频| 久久99国产精品视频| 国产视频一区欧美| 国产欧美丝祙| 狠狠干成人综合网| 国产福利资源一区| 激情久久婷婷| 国产精东传媒成人av电影| 好看的亚洲午夜视频在线| 精品视频一区二区三区四区五区 | 91福利精品在线观看| 欧美日韩激情| 麻豆视频在线观看免费网站黄| 国产精品嫩模av在线| 蜜臀久久99精品久久久久宅男 | 国产精品成人a在线观看| 精品不卡一区| 日韩av在线免费观看不卡| 亚洲一区二区三区中文字幕在线观看| 日韩国产一区二| 日韩中文影院| 成人精品动漫一区二区三区| 日韩精品乱码av一区二区| 亚洲中字黄色| 久久在线视频免费观看| 精品一区二区三区的国产在线观看| 亚洲我射av| 一本一道久久a久久| 蜜臀精品一区二区三区在线观看 | 黄色亚洲精品| 欧美日中文字幕| 亚洲五月婷婷| 欧美日韩尤物久久| av高清不卡| 亚洲成人不卡| 激情久久久久久| 午夜一区在线| 日韩国产欧美三级| 国产伦理久久久久久妇女| 国产精品v日韩精品v欧美精品网站 | 日本欧美大码aⅴ在线播放| 蜜臀国产一区二区三区在线播放 | 91成人在线网站| 美女久久精品| 日韩视频网站在线观看| 日韩亚洲一区在线| 国产综合激情| 久久高清国产| 日韩精品免费观看视频| 国产免费久久| 亚洲欧洲高清| 日韩专区欧美专区| 国产欧美在线| 精品一二三区| 最新日韩av| 日韩精品欧美成人高清一区二区| 日日夜夜免费精品| 精品黄色一级片| 在线 亚洲欧美在线综合一区| 首页国产欧美日韩丝袜| 国产欧美激情| 秋霞影院一区二区三区| 亚洲三级观看| 久久久精品国产**网站| 亚洲va在线| 国产区精品区| 欧美日韩国产高清| 你懂的亚洲视频| zzzwww在线看片免费| 视频一区免费在线观看| 欧美激情五月| 影音先锋久久| 黑森林国产精品av| 午夜亚洲福利| 久久久久亚洲精品中文字幕| 美日韩精品视频| 日本免费久久| 欧美国产另类| 亚洲影院天堂中文av色| 水蜜桃久久夜色精品一区| 午夜久久av| 99国产精品| 久久精品青草| 国产精品一卡| 国产精品丝袜xxxxxxx| 国产传媒在线| 国产精品久久久久久久久久久久久久久| 四虎影视精品| 久久久久久久欧美精品| 亚洲一区有码| 午夜视频一区二区在线观看| 午夜欧美精品久久久久久久| 久久免费高清| 日韩av在线免费观看不卡| 少妇精品久久久一区二区三区| 国产精品社区| 亚洲免费毛片| 国产日韩欧美一区二区三区| 一区二区三区午夜视频| 中文字幕亚洲在线观看| 蜜臀精品一区二区三区在线观看| 视频二区不卡| 久久久久久久久久久9不雅视频| 国产精品视频首页| 精品一区二区三区中文字幕| 成人午夜网址| 日韩在线综合| 激情丁香综合| 国产一区久久| 五月精品视频| 亚洲精一区二区三区| 久久国际精品| 精品三级av在线导航| 欧美不卡高清一区二区三区| 欧美国产91| 天堂网在线观看国产精品| 伊人成人在线视频| 国产剧情一区| www.51av欧美视频| 女人天堂亚洲aⅴ在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 免费人成精品欧美精品| 香蕉视频成人在线观看| 国产区精品区| 久久精品播放| 日韩影院精彩在线| 你懂的国产精品| 一区在线视频观看| 91精品xxx在线观看| 精品淫伦v久久水蜜桃| 国产亚洲一区| 日本麻豆一区二区三区视频| 中文亚洲免费| 婷婷综合社区| 欧美在线亚洲| 亚洲先锋成人| 日韩av福利| 中文字幕在线视频网站| 免费观看亚洲天堂| 国产精品资源| 天堂av在线一区| 国产麻豆一区二区三区精品视频| 91精品福利| 日韩专区欧美专区| 伊人久久av| 国产va在线视频| 精品国产不卡| 日韩在线短视频| 国产精品嫩草99av在线| 日韩精品一区第一页| 日本a口亚洲|