第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使用 TypeScript/JavaScript 中的函數(shù)式編程將元素推送到 Map 內(nèi)的數(shù)組?

如何使用 TypeScript/JavaScript 中的函數(shù)式編程將元素推送到 Map 內(nèi)的數(shù)組?

哈士奇WWW 2022-06-09 16:53:16
我剛剛開(kāi)始了從 OOP 背景到學(xué)習(xí) FP 的旅程,以及從編寫(xiě)普通 TypeScript(命令式?)遷移到功能 TypeScript 代碼的過(guò)程。不幸的是,我已經(jīng)在努力弄清楚如何將其更改為功能代碼:const foos: Map<  string,  Bar[]> = new Map();export const addBar = (  key: string,  bar: Bar) => {  const foo = foos.get(key);  if (foo) {    foo.push(bar);  } else {    foos.set(key, [bar]);  }};我了解如何在數(shù)組上使用 .map .filter .concat ,但是如何處理包含數(shù)組的 Map 呢?關(guān)于 foos Map 我猜 Map 本身需要是只讀的,而且里面的 Bar 數(shù)組也是如此,所以 .set .push 是不可能的。但是,如果我不能在 Map 上調(diào)用 .set 因?yàn)樗侵蛔x的,那么使用 Map 是否有意義,或者我應(yīng)該只使用一個(gè)對(duì)象?如果沒(méi)有可變性,如何將元素推送到 Map 值內(nèi)的數(shù)組(或者如果鍵不存在,則使用數(shù)組創(chuàng)建一個(gè)新映射,如上面的代碼中所示)?這是否足夠高效,因?yàn)槲倚枰扛魩酌胂驍?shù)組添加一個(gè)新元素,每次發(fā)生更改時(shí)復(fù)制整個(gè)地圖(包括其許多數(shù)組)的不可變方式不會(huì)比我執(zhí)行得更糟嗎?剛剛像您通常所做的那樣對(duì)數(shù)組進(jìn)行了變異?
查看完整描述

2 回答

?
FFIVE

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

您根本無(wú)法使用本機(jī)Map,因?yàn)樗鼉H提供命令式接口。


您可以使用開(kāi)源庫(kù),例如流行的 ImmutableJS。


或者您可以編寫(xiě)自己的持久(不可變)數(shù)據(jù)結(jié)構(gòu)?;疽笫悄臄?shù)據(jù)結(jié)構(gòu)提供的操作不會(huì)修改輸入。相反,每個(gè)操作都會(huì)返回一個(gè)新的數(shù)據(jù)結(jié)構(gòu) -


const PersistentMap =

  { create: () =>

      ({})

  , set: (t = {}, key, value) =>

      ({ ...t, [key]: value })      // <-- immutable operation

  }

我們首先看一張empty地圖,一個(gè)set操作的結(jié)果,然后確保empty地圖沒(méi)有被修改——


const empty =

  PersistentMap.create()


console.log

  ( empty

  , PersistentMap.set(empty, "hello", "world")

  , empty

  )


// {}

// { hello: "world" }

// {}

現(xiàn)在讓我們看一個(gè)新的中間狀態(tài),m1。每次我們看到set返回一個(gè)新的持久映射并且不修改輸入 -


const m1 =

  PersistentMap.set(empty, "hello", "earth")


console.log

  ( m1

  , PersistentMap.set(m1, "stay", "inside")

  , m1

  )

// { hello: "earth" }

// { hello: "earth", stay: "inside" }

// { hello: "earth" }

現(xiàn)在回答你的問(wèn)題,我們可以添加一個(gè)push操作到我們的PersitentMap- 我們只需要確保我們不修改輸入。這是一種可能的實(shí)現(xiàn)-


const PersistentMap =

  { // ...


  , push: (t = {}, key, value) =>

      PersistentMap.set            // <-- immutable operation

        ( t

        , key

        , Array.isArray(t[key])

            ? [ ...t[key], value ] // <-- immutable operation

            : [ value ]

        )

  }

我們push在下面看到行動(dòng)。請(qǐng)注意,m2也不會(huì)empty因此而改變 -


const m2 =

  PersistentMap.push(empty, "fruits", "apple")


console.log

  ( m2

  , PersistentMap.push(m2, "fruits", "peach")

  , m2

  , empty

  )


// { fruits: [ "apple" ] }

// { fruits: [ "apple", "peach" ] }

// { fruits: [ "apple" ] }

// {}

展開(kāi)下面的代碼段以在您自己的瀏覽器中驗(yàn)證結(jié)果

const PersistentMap =

  { create: () =>

      ({})

  , set: (t = {}, key, value) =>

      ({ ...t, [key]: value })

  , push: (t = {}, key, value) =>

      PersistentMap.set

        ( t

        , key

        , Array.isArray(t[key])

            ? [ ...t[key], value ]

            : [ value ]

        )

  }


const empty =

  PersistentMap.create()


console.log

  ( empty

  , PersistentMap.set(empty, "hello", "world")

  , empty

  )

// {}

// { hello: "world" }

// {}


const m1 =

  PersistentMap.set(empty, "hello", "earth")


console.log

  ( m1

  , PersistentMap.set(m1, "stay", "inside")

  , m1

  )

// { hello: "earth" }

// { hello: "earth", stay: "inside" }

// { hello: "earth" }


const m2 =

  PersistentMap.push(empty, "fruits", "apple")


console.log

  ( m2

  , PersistentMap.push(m2, "fruits", "peach")

  , m2

  , empty

  )

// { fruits: [ "apple" ] }

// { fruits: [ "apple", "peach" ] }

// { fruits: [ "apple" ] }

// {}


查看完整回答
反對(duì) 回復(fù) 2022-06-09
?
Cats萌萌

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊

我認(rèn)為這取決于你想要達(dá)到的目標(biāo)。如果您希望您的代碼是可測(cè)試的,F(xiàn)P 并不總是意味著只需要編寫(xiě)函數(shù),您仍然可以使用類,但是如果您有一段復(fù)雜的代碼要單獨(dú)測(cè)試,您可以導(dǎo)出該代碼段進(jìn)行測(cè)試,并且它看起來(lái)像這樣:


// types.ts

type FooDis = Record<string, object[]>;


// addBarToFoos.ts

export const addBarToFoos = (foos: FooDis) => (key: string, bar: object): FooDis {

  foos = {

    ...foos,

    [key]: [

      ...foos[key],

      bar

    ]

  };


  return foos;

}


// FooClass.ts 

export class FooClass {

  private foos: FooDis = {};


  addBar(key: string, bar: object) {

    this.foos = addBarToFoos(this.foos)(key, bar);

  }

}

這樣,“復(fù)雜”方法可以在沒(méi)有外部依賴的情況下單獨(dú)測(cè)試,并且您有一個(gè)使用該方法的實(shí)現(xiàn)。


查看完整回答
反對(duì) 回復(fù) 2022-06-09
  • 2 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)