如何對 Array 中的 Object 以指定值新增 Property ?
實務上較少更改 map()
所回傳的 object,若要新增 property 可使用 assoc()
。
失くすものさえない今が強くなるチャンスよ
實務上較少更改 map()
所回傳的 object,若要新增 property 可使用 assoc()
。
map()
的 Callback 常需要常需要從 Object 取得 Property,可使用 Ramda 的 prop()
使 Callback 能 Point-free。
ECMAScript 使用 [string.length - 1]
取得 String 最後一個 Char,只可惜這是 Operator 而非 Function,因此無法使用 Function Composition,Ramda 另外提供了 last()
供 FP 使用。
Operator 雖然精簡,若善用 FP 的 Declarative Programming Paradigm,其可讀性可能更高。
ECMAScript 使用 [array.length - 1]
取得 Array 最後一個 Element,只可惜這是 Operator 而非 Function,因此無法使用 Function Composition,Ramda 另外提供了 last()
供 FP 使用。
從 SQL 回傳資料為扁平狀,但實務上 API 常會回傳分組後且帶有巢狀資料,這種常見的需求該如何使用 Ramda 完成呢 ?
若要將多個值新增至 Array 中指定 Index,原本 Element 全部往後移,Ramda 提供了 insertAll()
。
若要將單一值新增至 Array 中指定 Index,原本 Element 全部往後移,Ramda 提供了 insert()
。
ECMAScript 使用 [0]
取得 String 第一個 char,只可惜這是 Operator 而非 Function,因此無法使用 Function Composition,Ramda 另外提供了 head()
供 FP 使用。
ECMAScript 使用 [0]
取得 Array 第一個 element,只可惜這是 Operator 而非 Function,因此無法使用 Function Composition,Ramda 另外提供了 head()
供 FP 使用。
當我們使用 Function 處理 String 時,常常第一個 Char 不是我們所要的,此時可用 tail()
剔除之。
當我們使用 Function 處理 Array 時,常常第一筆不是我們所要的,此時可用 tail()
剔除之。
這是 ECMAScript 的老梗,但為什麼 Ramda 的 map()
就沒事呢 ?
Ramda 也如原生 ECMAScript 提供 slice()
,唯 Ramda 的 slice()
是以 FP 形式呈現。
ECMAScript 的 Array.prototype
亦提供 slice()
取得部分 Array,也可套用在 Array-like object。
Ramda 也如原生 ECMAScript 提供 slice()
,唯 Ramda 的 slice()
是以 FP 形式呈現。
當我們使用 Function 處理 String 時,常常最後一個 Char 不是我們所要的,此時可用 init()
剔除之。
當我們使用 Function 處理 Array 時,常常最後一筆不是我們所要的,此時可用 init()
剔除之。
在組合 Function 時,實務上常常遇到期望的 Signature 與 Ramda 所提供的 Function 不一樣,此時可利用 flip()
加以改變。
map()
是 FP 最常用的 Higher Order Function,事實上我們也可自行實作 map()
練習 FP 基本功。
由於 Array 有豐富的 Function 可用,因此實務上常常將 String 轉成 Array 處理,最後再轉回 String。
Array 與 String 都是常用型別,Ramda 提供了 join()
能將 Array 轉成 String。
實務上我們常需判斷 Array 是否 全部不
符合某條件,若都不存在則傳回 true
,否則傳回 false
。
實務上有時需要在每一筆資料間新增顯示資料,如 Divider,Ramda 已經內建 intersperse()
,可直接使用。
reduce()
為 FP 代表性 Function,很多人覺得 redurce()
沒有 Imperative 的 for
Loop 直覺,因而避而遠之,事實上只是沒用對 reduce()
而已 。
reduce()
為 FP 代表性 Function,與 Array.prototype.reduce()
功能相同;唯內建的 reduce()
是以 OOP 掛在 Array 上,而 Ramda 的 reduce()
是以 FP 將 Array 傳入最後一個參數。
若想將 Array 中一系列 Function 套用到另一 Array,Ramda 並沒有提供適當 Function,我們可自行組合出 zipFunc()
。
zip()
只能制式的將兩個 Array 合併成 Array Pair,若想將兩個 Array 合併成其他形式則要使用 zipWith()
。
zip()
為 FP 代表性 Function,可直接將兩個 Array 合併成 Array Pair。
undefined
與 null
是 ECMAScript 很特殊的存在,實務上我們常會同時判斷 undefined
與 null
,有更優雅的寫法嗎 ?
若要從 Array 擷取其中一部分,但我們無法如 slice()
指定要的部分,只能指定不要的部分,此時我們可使用 Ramda 的 remove()
。
若要改變 Array 中指定 Index 值,Ramda 提供了 update()
,可自行傳入 Index 與 Value 改變之。
reduce()
只能回傳最後運算結果,若連運算的累積過程也要顯示,則要使用 scan()
。
實務上常需要對 API 所回傳的 Date 字串加工,如先增加 hours
,再增加 title
,這牽涉到增加 Date 與 String 兩種 Type,該如何優雅實現呢 ?
filter()
與 reject()
都能各自回傳 符合條件
與 不符合條件
資料,若想同時回傳兩者則要使用 partition()
。
若 Predicate 的 Argument 為 Object,我們需要對 Argument 先 Destructure 然後再判斷比較,此時可使用 Ramda 的 eqProps()
一步完成。
find()
為 Ramda 常用 Function,常搭配 propEq()
與 equals()
一併使用。
ECMAScript 對 Array 提供了 length()
讓我們獲得 Array 的大小;但對於 Object 的 Length,ECMAScript 並沒有提供直接方法,必須使用較 Tricky 方式。
ECMAScript 已經內建支援 Regular Expression,其功能強大無庸置疑,但由於可讀性不高,所以一直沒認真學習,但事實上 Regular Expression 投資報酬率非常高,幾乎所有語言都支援,學一次可用一輩子。
將原本單一 Argument Function,透過 Ramda 的 unapply()
成為多 Argument Function。