摘要:數(shù)組的方法大家對(duì)數(shù)組的,等的操作應(yīng)該都比較熟悉了。首先,的用法如下對(duì)數(shù)組中的所有元素調(diào)用指定的回調(diào)函數(shù)。語(yǔ)法注意這時(shí)候只能是同步方法參數(shù)含義通過(guò)上一次調(diào)用回調(diào)函數(shù)獲得的值。否者將是調(diào)用數(shù)組的第一項(xiàng)當(dāng)前數(shù)組元素的值。
數(shù)組的reduce方法
async await reduce array
大家對(duì)數(shù)組的map,filter,forEach等的操作應(yīng)該都比較熟悉了。這兩天寫(xiě)代碼的時(shí)候用到了reduce方法,一不小心寫(xiě)出了一個(gè)bug,在此記錄一下。
首先,reduce的用法如下:
對(duì)數(shù)組中的所有元素調(diào)用指定的回調(diào)函數(shù)。該回調(diào)函數(shù)的返回值為累積結(jié)果,并且此返回值在下一次調(diào)用該回調(diào)函數(shù)時(shí)作為參數(shù)提供。
語(yǔ)法:
array.reduce(callback[,initialValue]) //注意這時(shí)候只能是同步方法
function callbackfn(previousValue, currentValue, currentIndex, array1)
參數(shù) | 含義 |
---|---|
previousValue | 通過(guò)上一次調(diào)用回調(diào)函數(shù)獲得的值。如果向 reduce 方法提供initialValue,則在首次調(diào)用函數(shù)時(shí),previousValue 為 initialValue。否者將是調(diào)用數(shù)組的第一項(xiàng) |
currentValue | 當(dāng)前數(shù)組元素的值。 |
currentIndex | 當(dāng)前數(shù)組元素的數(shù)字索引。 |
array1 | 包含該元素的數(shù)組對(duì)象。 |
實(shí)現(xiàn):
// 實(shí)現(xiàn)數(shù)組的每一項(xiàng)之和 var arr = [1,2,3,4] arr.reduce((pre,cur) => {return pre + cur}) // return 10
實(shí)現(xiàn)數(shù)組的每一項(xiàng)轉(zhuǎn)化為對(duì)象,例({1: 1, 2: 2, 3: 3, 4: 4}) var arr = [1,2,3,4] arr.reduce((final,cur) => { final[cur] = cur return final }, {}) // return {1: 1, 2: 2, 3: 3, 4: 4}
BUG
昨天的代碼,我是這么實(shí)現(xiàn)的:
async function getGroup() { ... } async function getGroups() { var arr = [1,2,3] const result = arr.reduce(async (final,cur) => { final[cur] = await getGroup(cur) console.log(final, "<===final") return final }, {}) } // final的打印值 { "9ddc9834-9344-4cc1-be38-ba2d0e9d17c5": { recommendType: 1, weight: 123 } } "<===final" Promise { _c: [], _a: undefined, _s: 1, _d: true, _v: { "9ddc9834-9344-4cc1-be38-ba2d0e9d17c5": { recommendType: 1, weight: 123 } }, _h: 0, _n: false, "9bb6ed56-29a3-47e5-89a8-b652e8f08ef8": { recommendType: 2, weight: 12 } } "<===final" Promise { _c: [], _a: undefined, _s: 0, _d: false, _v: undefined, _h: 0, _n: false, "30ffffd8c9-2132-4d27-bc4b-4d27305acec9": {} }"<===final"
我們可以看到final的值并不是我們預(yù)期的,循環(huán)中只有第一個(gè)值是對(duì)的,后面的值都不對(duì),而且看起來(lái)是個(gè)Promise對(duì)象。這是為什么呢?
接下來(lái)看到上面的實(shí)現(xiàn)翻譯成reduce的底層實(shí)現(xiàn)方式:
var final = {} async function getGroup(final, cur){ final[cur] = await getGroup(cur) console.log(final, "<===final") return final } for(var i = 0, i < arr.lenght, i++) { final = getGroup(final, arr[i]) //這里沒(méi)有用async await執(zhí)行異步方法,導(dǎo)致,傳回的final只是個(gè)Promise方法對(duì)象 }
這樣我們就清楚為什么上面會(huì)打印這么奇怪的結(jié)果了。下面我們只要做小小的修改,就可以得到正確的結(jié)果:
var temp = {} async function getGroup() { ... } async function getGroups() { var arr = [1,2,3] const result = arr.reduce(async (final,cur) => { temp[cur] = await getGroup(cur) console.log(temp, "<===final") return temp }, {}) }
以后還是盡量避免在reduce里面執(zhí)行異步方法~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91372.html
摘要:基本概念方法接收一個(gè)函數(shù)作為累加器,數(shù)組中的每個(gè)值從左到右開(kāi)始縮減,最終為一個(gè)值。例進(jìn)階應(yīng)用使用方法可以完成多維度的數(shù)據(jù)疊加。在該函數(shù)內(nèi)部,則執(zhí)行多維的疊加工作。參考的內(nèi)建函數(shù)數(shù)組方法的高級(jí)技巧 基本概念 reduce() 方法接收一個(gè)函數(shù)作為累加器(accumulator),數(shù)組中的每個(gè)值(從左到右)開(kāi)始縮減,最終為一個(gè)值。 reduce 為數(shù)組中的每一個(gè)元素依次執(zhí)行回調(diào)函數(shù),不包括...
摘要:函數(shù),是規(guī)范中出現(xiàn)的數(shù)組方法。所有的一切通過(guò)一個(gè)函數(shù)來(lái)管理流程和傳遞初始參數(shù)。上面就是函數(shù)的實(shí)現(xiàn),它需要對(duì)象作為參數(shù),并返回一個(gè)類(lèi)型的函數(shù),作為的第一個(gè)參數(shù)。在該函數(shù)內(nèi)部,則執(zhí)行多維的疊加工作。 @(js) reduce函數(shù),是ECMAScript5規(guī)范中出現(xiàn)的數(shù)組方法。在平時(shí)的工作中,相信大家使用的場(chǎng)景并不多,一般而言,可以通過(guò)reduce方法實(shí)現(xiàn)的邏輯都可以通過(guò)forEach方法來(lái)...
摘要:簡(jiǎn)單例子一個(gè)較為常用的場(chǎng)景就是累加或累乘輸出數(shù)組元素的乘積輸出數(shù)組元素的乘積簡(jiǎn)寫(xiě)形式輸出數(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),如有解釋的不正確的地方,...
摘要:每次被執(zhí)行時(shí),和被傳入,這個(gè)根據(jù)進(jìn)行累加或者是自身消減,英文原意,進(jìn)而返回最新的。 之前的一篇文章:從一道面試題,到我可能看了假源碼討論了bind方法的各種進(jìn)階Pollyfill,今天再分享一個(gè)有意思的題目。 從解這道題目出發(fā),我會(huì)談到數(shù)組的Reduce方法,ES6特性和Redux數(shù)據(jù)流框架中Reducer的命名等等。一道典型的題目,卻如唐代詩(shī)人章碣《對(duì)月》詩(shī)中所云:別有洞天三十六,水...
摘要:數(shù)組方法中,相比等常用的迭代方法,常常被我們所忽略,今天一起來(lái)探究一下在我們實(shí)戰(zhàn)開(kāi)發(fā)當(dāng)中,能有哪些妙用之處,下面從語(yǔ)法開(kāi)始介紹。按順序運(yùn)行異步函數(shù)我們可以做的另一件事是按順序運(yùn)行而不是并行。函數(shù)返回一個(gè)對(duì)象,可以使用方法添加回調(diào)函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019423051); Javascript數(shù)組方...
閱讀 2466·2021-11-23 09:51
閱讀 526·2019-08-30 13:59
閱讀 1829·2019-08-29 11:20
閱讀 2536·2019-08-26 13:41
閱讀 3244·2019-08-26 12:16
閱讀 733·2019-08-26 10:59
閱讀 3327·2019-08-26 10:14
閱讀 604·2019-08-23 17:21