亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

每日一面——深入理解reduce方法

Paul_King / 3049人閱讀

摘要:引言有一段時(shí)間沒(méi)更新了,最近挺忙的懶病犯了。例數(shù)組累加例計(jì)算總價(jià)蘋(píng)果桃子西瓜自己實(shí)現(xiàn)一個(gè)方法知道了的兩種模式利用遞歸實(shí)現(xiàn)它并不復(fù)雜參數(shù)有個(gè)。數(shù)據(jù)從這些方法組成的管道中流淌一遍出來(lái)就得到想要的結(jié)果了。

引言

有一段時(shí)間沒(méi)更新了,最近挺忙的(懶病犯了)。今天偶然想到之前去去哪兒面試的時(shí)候,面試管問(wèn)我的redece題目,當(dāng)時(shí)被血虐的場(chǎng)景。干脆今天我們就來(lái)聊一下redece方法以及相關(guān)的應(yīng)用

reduce方法j介紹

reduce(callback,initval)
其中callback函數(shù)接收4個(gè)參數(shù):

Accumulator (acc) (累計(jì)器)

Current Value (cur) (當(dāng)前值)

Current Index (idx) (當(dāng)前索引)

Source Array (src) (源數(shù)組)

如果initval傳了,則索引從0開(kāi)始,acc是initval,cur是arr[0]
如果initval沒(méi)有傳,則索引從1開(kāi)始,acc是arr[0],cur是arr[1]
reducer 函數(shù)的返回值分配給累計(jì)器,該返回值在數(shù)組的每個(gè)迭代中被記住,并最后成為最終的單個(gè)結(jié)果值。

例1:數(shù)組累加
const arr = [1,2,3,4,5];
console.log(arr.reduce((pre,cur)=>{return pre+cur}))
//1+2+3+4+5 15
例2: 計(jì)算總價(jià)
var product = [
    {
        name: "蘋(píng)果",
        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
自己實(shí)現(xiàn)一個(gè)reduce方法

知道了reduce的兩種模式,利用遞歸實(shí)現(xiàn)它并不復(fù)雜

// callback參數(shù)有4個(gè)。pre,cur,index,arr
Array.prototype.myReduce = function(callback,prev){
    for(let i = 0 ; i < this.length; i++){
    // 判斷有沒(méi)有第二個(gè)參數(shù) 
        if(!prev){ // 沒(méi)有prev復(fù)雜點(diǎn),第一次拿的是兩個(gè)元素arr[0],arr[1],注意index的變化 
            prev = callback(this[i],this[i+1],i+1,this); //這里的指針是i+1都是對(duì)的,但是下一次循環(huán)的時(shí)候i必須按是3所以需要+1
            i++; // 第一次循環(huán)了兩個(gè)變量,下次應(yīng)該從第三個(gè)執(zhí)行,所以向后移動(dòng)
        }else{ //有prev簡(jiǎn)單,直接就是從arr[0]開(kāi)始遞歸
            prev = callback(prev,this[i],i,this);
        }
    }
    return prev;
}
應(yīng)用

好不容易學(xué)了reduce,只計(jì)算個(gè)水果價(jià)格,是不是有點(diǎn)太小才大用了?
我們看一看面試中能直接大幅度提升逼格的題目

1.統(tǒng)計(jì)字符串中出現(xiàn)的字母?jìng)€(gè)數(shù)

相信大家都應(yīng)該知道怎么用for-in怎么遍歷數(shù)組(字符串split出來(lái)的)并借助一個(gè)空對(duì)象來(lái)計(jì)數(shù)
但是面試寫(xiě)十幾行代碼還是比較low而且容易出錯(cuò)的
我們看一個(gè)逼格高一點(diǎn)的實(shí)現(xiàn)

var arrString = "abcdaabc";

arrString.split("").reduce((res, cur)=>{
    res[cur] ? res[cur] ++ : res[cur] = 1
    return res;
}, {})
2.數(shù)組扁平化

面試官讓實(shí)現(xiàn)一個(gè)原生的flat方法
這個(gè)方法項(xiàng)目中經(jīng)常用,但是兼容性不好,而且babel目前好像還沒(méi)有這個(gè)polyfill,那我們就直接在入口文件中判斷一下,如果不存在則添加數(shù)組的flat方法

// arr.flat(depth)  原生的語(yǔ)法 depth指定要提取嵌套數(shù)組的結(jié)構(gòu)深度,默認(rèn)是1 傳0不扁平話,傳Infinity則展開(kāi)任意深度的嵌套數(shù)組

我們先不考慮depth 怎么用遞歸實(shí)現(xiàn)一版展開(kāi)任意深度的flat方法
Array.prototype.myflat = function(depth = 1) {
  return this.reduce((pre, cur) => {
    if (Array.isArray(cur)) {
      // 這里應(yīng)該每次reduce都產(chǎn)生一個(gè)新的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.實(shí)現(xiàn)compose函數(shù)

最后簡(jiǎn)單介紹一下compose方法以及怎么利用reduce 一行代碼實(shí)現(xiàn)。 這可是中間件的原理,大家仔細(xì)聽(tīng)!

var compose = function(f,g) { //compose極簡(jiǎn)寫(xiě)法,僅做示例
    return function(x){
        return f(g(x))
    }

}
f和g都是函數(shù),x是在他們之間通過(guò)"管道" 傳輸?shù)闹怠?br>compose看起來(lái)就像是飼養(yǎng)函數(shù),你就是飼養(yǎng)員。你可以選擇多個(gè)有特點(diǎn)的函數(shù),讓它們結(jié)合,產(chǎn)生一個(gè)嶄新的函數(shù)。

有個(gè)這個(gè)函數(shù)我們能干嘛呢
我們看一個(gè)例子:
我們現(xiàn)在想統(tǒng)計(jì)兩個(gè)字符串的總長(zhǎng)度 并打印:總長(zhǎng)度:xxx
一般的寫(xiě)法就是寫(xiě)一坨
函數(shù)式編程告訴我們不要這樣做,這么寫(xiě)耦合性太高了,不好維護(hù),我們應(yīng)該想搭積木一樣,拆成若果基礎(chǔ)方法,然后在拼接起來(lái)。 數(shù)據(jù)從這些方法組成的管道中流淌一遍出來(lái)就得到想要的結(jié)果了。
好處就是低耦合,可組合(像不像dota里面的卡爾,qwe三個(gè)球搭配可以調(diào)出N多技能)
于是我們這么寫(xiě)

function sum(a,b){
    return a+b;
}
function len(str){
    return str.length
}
function addPrefix(content){
    return "總長(zhǎng)度:"+content;
}
console.log(addPrefix(len(sum("x-1","y-2"))))  //看著怪怪的

這么寫(xiě)最后一句話真的很煩人
于是借用compose函數(shù)我們這么寫(xiě)

const newFn = compose(addPrefix,len,sum)
console.log(newFn("x-1","y-2"))

compose函數(shù)利用reduce我給出3種實(shí)現(xiàn),下次有時(shí)間再細(xì)說(shuō)

//利用reduceRight
function compose(...fns){
    return function(...args){
        let lastFn = fns.pop();
        return fns.reduceRight((prev,current)=>{   //[addPrefix,len,sum]
            return current(prev) // 每次當(dāng)前函數(shù)處理得是之前函數(shù)處理得結(jié)果?。?! 但是首個(gè)不一樣,首個(gè)就是首個(gè)函數(shù)得執(zhí)行結(jié)果
        },lastFn(...args)) //先得把參數(shù)傳入進(jìn)來(lái)
    }
}


//利用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返回的是一個(gè)函數(shù) 
            return a(b(...args)) 
        }
    })
}

//reduce簡(jiǎn)化版 一行代碼搞定   面試裝B必背
let compose = (...fns)=>fns.reduce((a,b)=>(...args)=>a(b(...args)));
總結(jié)

今天的匯報(bào)就到這了,謝謝大家百忙中抽出時(shí)間閱讀,相信掌握上面reduce個(gè)個(gè)層次用例,面試這方面一定是滿(mǎn)滿(mǎn)的逼格。另外本人技術(shù)有限,如果哪寫(xiě)的不對(duì),歡迎在評(píng)論區(qū)留言指出。

列表項(xiàng)目

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105339.html

相關(guān)文章

  • 每日一面——仿寫(xiě)reverse方法

    摘要:引言今天小問(wèn)了我一個(gè)面試題,怎么實(shí)現(xiàn)一個(gè)實(shí)方法,在實(shí)現(xiàn)的過(guò)程中我還是犯了一些錯(cuò),實(shí)現(xiàn)完以后,對(duì)一些知識(shí)點(diǎn)的理解又加深了。此時(shí)還是在上,并且至少在當(dāng)前的方法中不會(huì)再被改變了,因?yàn)闆](méi)有哪個(gè)指針能指向它了。 引言 今天小K問(wèn)了我一個(gè)面試題,怎么實(shí)現(xiàn)一個(gè)實(shí)reverse方法,在實(shí)現(xiàn)的過(guò)程中我還是犯了一些錯(cuò),實(shí)現(xiàn)完以后,對(duì)一些知識(shí)點(diǎn)的理解又加深了。 錯(cuò)誤的寫(xiě)法 最開(kāi)始我是這么寫(xiě)的 var arr...

    未東興 評(píng)論0 收藏0
  • JS每日一題:函數(shù)式編程中代碼組合(compose)如何理解?

    摘要:期函數(shù)式編程中代碼組合如何理解定義顧名思義,在函數(shù)式編程中,就是將幾個(gè)有特點(diǎn)的函數(shù)拼湊在一起,讓它們結(jié)合,產(chǎn)生一個(gè)嶄新的函數(shù)代碼理解一個(gè)將小寫(xiě)轉(zhuǎn)大寫(xiě)的函數(shù)一個(gè)在字符后加的函數(shù)將兩個(gè)函數(shù)組合起來(lái)這里假設(shè)我們實(shí)現(xiàn)了每日一題每日一題顯示結(jié)果里上面 20190315期 函數(shù)式編程中代碼組合(compose)如何理解? 定義: 顧名思義,在函數(shù)式編程中,Compose就是將幾個(gè)有特點(diǎn)的函數(shù)拼湊在...

    Kaede 評(píng)論0 收藏0
  • 2019春招前端實(shí)習(xí)面經(jīng)總結(jié)

    摘要:春招前端實(shí)習(xí)面試記錄從就開(kāi)始漸漸的進(jìn)行復(fù)習(xí),月末開(kāi)始面試,到現(xiàn)在四月中旬基本宣告結(jié)束。上海愛(ài)樂(lè)奇一面盒模型除之外的面向?qū)ο笳Z(yǔ)言繼承因?yàn)槭且曨l面試,只記得這么多,只感覺(jué)考察的面很廣,前端后端移動(dòng)端都問(wèn)了,某方面也有深度。 春招前端實(shí)習(xí)面試記錄(2019.3 ~ 2019.5) 從2019.1就開(kāi)始漸漸的進(jìn)行復(fù)習(xí),2月末開(kāi)始面試,到現(xiàn)在四月中旬基本宣告結(jié)束。在3月和4月經(jīng)歷了無(wú)數(shù)次失敗,沮...

    atinosun 評(píng)論0 收藏0
  • 每日 30 秒 ? 該不該優(yōu)雅

    showImg(https://segmentfault.com/img/remote/1460000018734296?w=900&h=500); 簡(jiǎn)介 可讀性、性能、Spread、Reduce 在 優(yōu)雅三連擊 中有同學(xué)提到了 可讀性 這個(gè)關(guān)鍵詞,就小二個(gè)人的觀點(diǎn) 在某個(gè)范圍內(nèi)使用比較常用到的小技巧,可以提升一定的可讀性,文中提到的短路運(yùn)算在初始化變量是提升可讀性的,并且在很多提倡優(yōu)化if 語(yǔ)句...

    JohnLui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Paul_King

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<