使用 not() 實現 toggle
Toggle 為實務上常見的需求,Imperative 會使用 !
Operator,在 FP 可使用 not()
。
失くすものさえない今が強くなるチャンスよ
Toggle 為實務上常見的需求,Imperative 會使用 !
Operator,在 FP 可使用 not()
。
pick()
只能擷取 Object 的部分 Property,且名稱不能改變,若連名稱也要改變,就要改用 applySpec()
。
若要將 Object 的所有 Key 轉成 Array,可使用 Ramda 的 keys()
。
若資料是 CSV,可透過 Ramda 輕易將其轉成 Object Array。
實務上資料常以 Object Array 儲存,可透過 Ramda 將其轉成 CSV。
實務上從 API 取得資料時,常只需部分欄位,並對部分欄位加工處理,這種常見需求可用 pick()
+ evolve()
加以實現。
實務上在使用 map()
時,經常是只改變某些 Property,此時當然可以在 Callback 自行組合 Object,但也可使用 Ramda 的 evolve()
使 Callback 也 Point-free。
實務上常遇到中間 String 符合預期,但後面 String 不符合規格,此時可用 dropLast()
加以刪除。
實務上我們常需判斷 Array 是否 任意
資料符合某條件,若存在則傳回 true
,若不存在則傳回 false
,Ramda 提供了 any()
可判斷。
實務上我們常需判斷 Array 是否 全部
符合某條件,若存在則傳回 true
,若不存在則傳回 false
,可使用 all()
判斷。
若要改變 Array 中指定 Index 值,可使用 adjust
自行傳入 Index 與 Function 改變之。
replace()
可取代 String,搭配 Regular Expression /g
可一次取代所有 String。
Ramda 的 chain()
是很神奇的 Function,除了視為 flatMap()
外,也可用於 Monad,只要在 Monad 內將值也改為 Monad 時,亦可使用 chain()
。
chain()
屬於 Ramda 較進階 Function,威力強大。當 Data 為 Nested Array 時,其結果將攤平為一層 Array,俗稱 flatMap()
。
chain()
在實務上其實常常用到,只在於你有沒有發現而已,map(split)
典型會產生兩層 Array,此時可使用 chain()
加以重構。
ECMAScript 2015 提出了 Promise 後,提供了 then()
用法,而 ECMAScript 2017 又提出了 await
用法,但 Vue 該如何活用 then()
與 await
呢 ?
Promise 傳統都用來處理 Asynchronous 代表 未來值
,但由於其具有 Rejected 與 Fulfilled,很類似 Either 的 Left 與 Right,且 then()
又兼具 map()
與 chain()
特性,因此可藉由 Promise 實現 Either 處理 Exception。
Promise 是 ECMAScript 2015 所提出的新型態,專門處理 Asynchronous,雖然也可 await
之後繼續以 Imperative 處理,但 Promise 本身具有 Functor 與 Monad 的一些特性,可搭配 Pure Function 繼續處理。
Radio 必須點到 方框
才能選取,實務上會想要點擊 Label 也相當於選擇 Radio,可將 <input>
與 <label>
合作達成。
where()
可自行傳入 Function 比較更為靈活,但對於常用的 equals()
,則使用 whereEq()
更為精簡。
由於 filter()
這類 Function 需要傳進 Predicate,若 Data 為 Object Array,勢必先取出 Property 再進行比較,勢必使用 pipe()
產生 Predicate,此時可改用 where()
可讀性更高。
transduce()
並不適用所有 function,必須是 transducer 方可使用,sum()
就是典型非 transducer。
若要判斷資料是否存在於 String,直覺會使用 includes()
,事實上也能使用 test()
。
Ramda 有提供 startsWith()
可判斷 String 字首是否為指定字串,但 startsWith()
並不支援 Number,需稍微加工後才能使用。
FP 常被人詬病效率問題,若使用 pipe()
組合了 3 個 Function,由於 Pure Function 每次都回傳全新 Array,因此要執行三次 Loop,在 Array 筆數大時有明顯劣勢,透過 transduce()
只要執行一次 Loop 即可。
Ramda 內建不少支援 Pair 的 Function,但卻沒有 snd()
,實務上可用 last()
實現 snd()
。
Ramda 內建不少支援 Pair 的 Function,但卻沒有 fst()
,實務上可用 head()
實現 fst()
。
很多人覺得 Closure 與 Currying 太過學術,實務上很少用到,事實上 Closure 與 Currying 搭配 Promise Chain 幾乎天天都會使用。
若以 Pair 形式表示 Key / Value,而以 Pair Array 表示整個 Object,可使用 Ramda 的 fromPairs()
直接轉成 Object。
實務上為了精簡,API 有時會將一對資料以 Object 形式傳遞,但處理上 Array 還是比 Object 方便,Ramda 提供了 toPairs()
將 Object 轉成 Pair Array。
實務上 API 多半回傳 Object Array,但若想當做 Map 使用時 Object 會比較方便,因此常常需要將 Object Array 轉成 Object。
ap()
與 seq()
都是 S Combinator,但其 Signature 不同,因此使用時機也不太一樣。
實務上常使用 Object Array,有時候必須在原本 Object 加上 Index,這種常見需求該如何實現呢 ?
計算 Array 的平均值為常見需求,但 Ramda 並沒有內建 avg()
,但可自行組合。
實務上常須對 Function 的 Argument 先經過處理後,在傳給主要 Function 運算,此時可使用 juxt()
先處理,再以 pipe()
組合其他 Function。
lift()
除了能將一般 Function 提升成能處理 Apply 的 function 外,還能將多個 Array 中的值做排列組合運算。
實務上常將 Array 中 Object 的某個 Property 取出其 Value 成為新 Array,且不希望有 Object 與 Key,此時可使用 pluck()
取代 map(prop())
。
ECMAScript 2015 提供了 catch()
處理 Rejected Promise,而 2017 更提供了 try catch
直接在 catch
Block 處理;事實上 Ramda 也提供了 otherwise()
,讓我們以 Function Pipeline 處理 Rejected Promise。
ECMAScript 2015 的最大亮點之一就是提出 Promise 這種 未來值
概念避免 Callback Hell,但很多人卻很依賴 async await
將 Promise 立即轉為一般值處理,事實上可使用 Pure Function 在 Promise 內處理,並直接以 pipe()
組合 Pure Function。
ECMAScript 2015 的 Promise 自帶 then()
,讓我們能類似 Functor 的 map()
或 Monad 的 chain()
直接修改 Promise 內部資料,唯 then()
是 Method Chaining 而不是 Function Pipeline,因此 Ramda 提供 Function 版的 then()
。