摘要:引言有一段時間沒更新了,最近挺忙的懶病犯了。例數(shù)組累加例計算總價蘋果桃子西瓜自己實現(xiàn)一個方法知道了的兩種模式利用遞歸實現(xiàn)它并不復(fù)雜參數(shù)有個。數(shù)據(jù)從這些方法組成的管道中流淌一遍出來就得到想要的結(jié)果了。
引言
有一段時間沒更新了,最近挺忙的(懶病犯了)。今天偶然想到之前去去哪兒面試的時候,面試管問我的redece題目,當時被血虐的場景。干脆今天我們就來聊一下redece方法以及相關(guān)的應(yīng)用
reduce方法j介紹reduce(callback,initval)
其中callback函數(shù)接收4個參數(shù):
Accumulator (acc) (累計器)
Current Value (cur) (當前值)
Current Index (idx) (當前索引)
Source Array (src) (源數(shù)組)
如果initval傳了,則索引從0開始,acc是initval,cur是arr[0]
如果initval沒有傳,則索引從1開始,acc是arr[0],cur是arr[1]
reducer 函數(shù)的返回值分配給累計器,該返回值在數(shù)組的每個迭代中被記住,并最后成為最終的單個結(jié)果值。
const arr = [1,2,3,4,5]; console.log(arr.reduce((pre,cur)=>{return pre+cur})) //1+2+3+4+5 15例2: 計算總價
var product = [ { name: "蘋果", count: 2, price: 5 }, { name: "桃子", count: 5, price: 2 }, { name: "西瓜", count: 1, price: 10 } ]; var total = product.reduce((pre,cur)=>{ return pre+cur.count*cur.price },0) // 30自己實現(xiàn)一個reduce方法
知道了reduce的兩種模式,利用遞歸實現(xiàn)它并不復(fù)雜
// callback參數(shù)有4個。pre,cur,index,arr Array.prototype.myReduce = function(callback,prev){ for(let i = 0 ; i < this.length; i++){ // 判斷有沒有第二個參數(shù) if(!prev){ // 沒有prev復(fù)雜點,第一次拿的是兩個元素arr[0],arr[1],注意index的變化 prev = callback(this[i],this[i+1],i+1,this); //這里的指針是i+1都是對的,但是下一次循環(huán)的時候i必須按是3所以需要+1 i++; // 第一次循環(huán)了兩個變量,下次應(yīng)該從第三個執(zhí)行,所以向后移動 }else{ //有prev簡單,直接就是從arr[0]開始遞歸 prev = callback(prev,this[i],i,this); } } return prev; }應(yīng)用
好不容易學了reduce,只計算個水果價格,是不是有點太小才大用了?
我們看一看面試中能直接大幅度提升逼格的題目
相信大家都應(yīng)該知道怎么用for-in怎么遍歷數(shù)組(字符串split出來的)并借助一個空對象來計數(shù)
但是面試寫十幾行代碼還是比較low而且容易出錯的
我們看一個逼格高一點的實現(xiàn)
var arrString = "abcdaabc"; arrString.split("").reduce((res, cur)=>{ res[cur] ? res[cur] ++ : res[cur] = 1 return res; }, {})2.數(shù)組扁平化
面試官讓實現(xiàn)一個原生的flat方法
這個方法項目中經(jīng)常用,但是兼容性不好,而且babel目前好像還沒有這個polyfill,那我們就直接在入口文件中判斷一下,如果不存在則添加數(shù)組的flat方法
// arr.flat(depth) 原生的語法 depth指定要提取嵌套數(shù)組的結(jié)構(gòu)深度,默認是1 傳0不扁平話,傳Infinity則展開任意深度的嵌套數(shù)組 我們先不考慮depth 怎么用遞歸實現(xiàn)一版展開任意深度的flat方法 Array.prototype.myflat = function(depth = 1) { return this.reduce((pre, cur) => { if (Array.isArray(cur)) { // 這里應(yīng)該每次reduce都產(chǎn)生一個新的depth let _depth = depth if (_depth > 0) { _depth-- pre = [...pre, ...cur.myflat(_depth)] } else { // depth = 0控制結(jié)束遞歸 if (cur.length !== 0) { // 空數(shù)組拋棄! pre.push(cur) } } } else { pre.push(cur) } return pre }, []) } console.log([1, 2, [3,[5,[1]]], 4].myflat()) //[ 1, 2, 3, [ 5, [ 1 ] ], 4 ] console.log([1, 2, [3,[5,[1]]], 4].myflat(0)) //[ 1, 2, [ 3, [ 5, [ 1 ] ] ], 4 ] console.log([1, 2, [3,[5,[1]]], 4].myflat(2)) //[ 1, 2, 3, 5, [ 1 ], 4 ] console.log([1, 2, [3,[5,[1]]], 4].myflat(Infinity)) //[ 1, 2, 3, 5, 1, 4 ] console.log([1, 2], [3]].myflat()) //[ 1, 2, 3 ]3.實現(xiàn)compose函數(shù)
最后簡單介紹一下compose方法以及怎么利用reduce 一行代碼實現(xiàn)。 這可是中間件的原理,大家仔細聽!
var compose = function(f,g) { //compose極簡寫法,僅做示例 return function(x){ return f(g(x)) } }
f和g都是函數(shù),x是在他們之間通過"管道" 傳輸?shù)闹怠?br>compose看起來就像是飼養(yǎng)函數(shù),你就是飼養(yǎng)員。你可以選擇多個有特點的函數(shù),讓它們結(jié)合,產(chǎn)生一個嶄新的函數(shù)。
有個這個函數(shù)我們能干嘛呢
我們看一個例子:
我們現(xiàn)在想統(tǒng)計兩個字符串的總長度 并打印:總長度:xxx
一般的寫法就是寫一坨
函數(shù)式編程告訴我們不要這樣做,這么寫耦合性太高了,不好維護,我們應(yīng)該想搭積木一樣,拆成若果基礎(chǔ)方法,然后在拼接起來。 數(shù)據(jù)從這些方法組成的管道中流淌一遍出來就得到想要的結(jié)果了。
好處就是低耦合,可組合(像不像dota里面的卡爾,qwe三個球搭配可以調(diào)出N多技能)
于是我們這么寫
function sum(a,b){ return a+b; } function len(str){ return str.length } function addPrefix(content){ return "總長度:"+content; } console.log(addPrefix(len(sum("x-1","y-2")))) //看著怪怪的
這么寫最后一句話真的很煩人
于是借用compose函數(shù)我們這么寫
const newFn = compose(addPrefix,len,sum) console.log(newFn("x-1","y-2"))
compose函數(shù)利用reduce我給出3種實現(xiàn),下次有時間再細說
//利用reduceRight function compose(...fns){ return function(...args){ let lastFn = fns.pop(); return fns.reduceRight((prev,current)=>{ //[addPrefix,len,sum] return current(prev) // 每次當前函數(shù)處理得是之前函數(shù)處理得結(jié)果!!! 但是首個不一樣,首個就是首個函數(shù)得執(zhí)行結(jié)果 },lastFn(...args)) //先得把參數(shù)傳入進來 } } //利用reduce // 遞歸規(guī)律如下 // a:addPrefix b:len // a:function(...args){return addPrefix(len(...args))} b:sum function compose(...fns){ return fns.reduce(function(a,b){ return function(...args){ //compose返回的是一個函數(shù) return a(b(...args)) } }) } //reduce簡化版 一行代碼搞定 面試裝B必背 let compose = (...fns)=>fns.reduce((a,b)=>(...args)=>a(b(...args)));總結(jié)
今天的匯報就到這了,謝謝大家百忙中抽出時間閱讀,相信掌握上面reduce個個層次用例,面試這方面一定是滿滿的逼格。另外本人技術(shù)有限,如果哪寫的不對,歡迎在評論區(qū)留言指出。
列表項目
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/105339.html
摘要:引言今天小問了我一個面試題,怎么實現(xiàn)一個實方法,在實現(xiàn)的過程中我還是犯了一些錯,實現(xiàn)完以后,對一些知識點的理解又加深了。此時還是在上,并且至少在當前的方法中不會再被改變了,因為沒有哪個指針能指向它了。 引言 今天小K問了我一個面試題,怎么實現(xiàn)一個實reverse方法,在實現(xiàn)的過程中我還是犯了一些錯,實現(xiàn)完以后,對一些知識點的理解又加深了。 錯誤的寫法 最開始我是這么寫的 var arr...
摘要:期函數(shù)式編程中代碼組合如何理解定義顧名思義,在函數(shù)式編程中,就是將幾個有特點的函數(shù)拼湊在一起,讓它們結(jié)合,產(chǎn)生一個嶄新的函數(shù)代碼理解一個將小寫轉(zhuǎn)大寫的函數(shù)一個在字符后加的函數(shù)將兩個函數(shù)組合起來這里假設(shè)我們實現(xiàn)了每日一題每日一題顯示結(jié)果里上面 20190315期 函數(shù)式編程中代碼組合(compose)如何理解? 定義: 顧名思義,在函數(shù)式編程中,Compose就是將幾個有特點的函數(shù)拼湊在...
摘要:春招前端實習面試記錄從就開始漸漸的進行復(fù)習,月末開始面試,到現(xiàn)在四月中旬基本宣告結(jié)束。上海愛樂奇一面盒模型除之外的面向?qū)ο笳Z言繼承因為是視頻面試,只記得這么多,只感覺考察的面很廣,前端后端移動端都問了,某方面也有深度。 春招前端實習面試記錄(2019.3 ~ 2019.5) 從2019.1就開始漸漸的進行復(fù)習,2月末開始面試,到現(xiàn)在四月中旬基本宣告結(jié)束。在3月和4月經(jīng)歷了無數(shù)次失敗,沮...
showImg(https://segmentfault.com/img/remote/1460000018734296?w=900&h=500); 簡介 可讀性、性能、Spread、Reduce 在 優(yōu)雅三連擊 中有同學提到了 可讀性 這個關(guān)鍵詞,就小二個人的觀點 在某個范圍內(nèi)使用比較常用到的小技巧,可以提升一定的可讀性,文中提到的短路運算在初始化變量是提升可讀性的,并且在很多提倡優(yōu)化if 語句...
閱讀 2224·2019-08-30 15:53
閱讀 2452·2019-08-30 12:54
閱讀 1197·2019-08-29 16:09
閱讀 728·2019-08-29 12:14
閱讀 754·2019-08-26 10:33
閱讀 2481·2019-08-23 18:36
閱讀 2959·2019-08-23 18:30
閱讀 2118·2019-08-22 17:09