iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
自我挑戰組

菜雞也能優雅的征服RxJS系列 第 9

菜雞也能優雅的征服RxJS - day9-資料轉換類(1) map

  • 分享至 

  • xImage
  •  

  • javascriptArray提供一個map函式,相信用過的人一定愛不釋手,經過一個設定,就能轉換出我們要的資料。
  • 底下就是map的一個例子,我們將收到的每個值+10,之後我們就能得到一個資料為[11,12,13,14,15]array囉!
[1,2,3,4,5].map(val=>val+10); //[11,12,13,14,15]
  • 今天介紹的RxJS map就是與這樣的概念一致,趕緊來看看吧!☕

map

圖片來源 RxJS官網 - map

  • map的定義:map(定義一個函式,將來源的每一筆資料,透過轉換再輸出),很簡單吧!先來看下面的例子。

case1:map基本用法

stackblitz

import { map, from, fromEvent } from 'rxjs';

// case1: map
const obs$ = from([1, 2, 3, 4, 5]).pipe(map((val) => val + 10));
obs$.subscribe(console.log);  

//印出 11,12,13,14,15

case2:用fromEvent+map解析鍵盤輸入的資料

  • 我們使用fromEvent(doucment, 'keyup')搭配map來分析我們要判定的資料。
    stackblitz
// case2: fromEvent + map
const keyCode$ = fromEvent(document, 'keyup').pipe(
  map((event: KeyboardEvent) => event.code) // 用map解析KeyboardEvent的資料,並用next傳出
);
keyCode$.subscribe(console.log);

  • 經由map解析資料,取出code對應的value,就能得知我們按下什麼鍵啦!!

題外話聊聊pluck

  • 剛剛透過官網才知道,pluck即將在v8版本被移除(目前我們使用RxJS-V7.5.5),官方建議使用map就可以達到我們要的功能。

stackblitz

// case3: pluck
console.log('case3: pluck');
const keyCodePluck$ = of(
  { one: { num: 111 }, two: { num: 222 } },
  { one: { num: 123 }, two: { num: 223 } }
).pipe(
  // map((event: KeyboardEvent) => event.code)
  // pluck('one'), //<--第一層的key放第1個
  pluck('one', 'num') //<--第二層的key放第2個
);
keyCodePluck$.subscribe(console.log);
  • 定義:pluck(第一層的key, 第二層的key...第N層的key),如果你的資料是巢狀的Object,依序定義你的key就能順利地取出我們的資料囉

✍補充說明:

observer怎沒定義了?

  • 眼尖的朋友應該發現我們的observer的定義拿掉了,直接在subscribe(console.log);因為RxJS會自動地把console.log轉譯成{next:(data)=>console.log(data)},為了方便,未來我們也會採取這樣的方式來進行。

pipe施打連續技

  • pipeobservable內建的一個函釋,可以搭配RxJS內建豐富的operator;隨著我們介紹越多的operator,你就可以自由地組合出完美的連續技!

  • 喔耶~第9天打完收工,咱們準備迎接第10天啦!!

上一篇
菜雞也能優雅的征服RxJS - day8-創建類(3): 老師!給我一個固定的節拍 interval ,timer
下一篇
菜雞們也能優雅的征服RxJS - day10: 實戰1 - 取得scroll百分比
系列文
菜雞也能優雅的征服RxJS32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言