點燈坊

失くすものさえない今が強くなるチャンスよ

使用 mergeRight() 由右至左合併兩個 Object

Sam Xiao's Avatar 2020-03-15

欲將兩個 Object 合併成單一 Object,若 Property 重複,則以第二個 Object 為主,可使用 Ramda 的 mergeRight()

Version

macOS Mojave 10.15.3
VS Code 1.43.0
Quokka 1.0.282
Ramda 0.27.0

ECMAScript

let merge = (l, r) => Object.assign({}, l, r)

let left = {
  title: 'FP in JavaScript',
  price: 100
}

let right = {
  price: 200
}

merge(left, right) // ?

其實 merge() 就是 ECMAScript 古老的 Object.assign()

merge003

Ramda

import { merge } from 'ramda'

let left = {
  title: 'FP in JavaScript',
  price: 100
}

let right = {
  price: 200
}

merge(left, right) // ?

Ramda 已經提供 merge() 可直接使用。

merge()
{k: v} -> {k: v} -> {k: v}
將兩個 object 合併,若 property 相同,則第二個 object 的 property 會蓋掉第一個 object

{k: v}:第一個 object

{k: v}:第二個 object

{k: v}:回傳合併後的 object

merge000

price property 重複,以第二個 object 的 200 取代。

merge001

不過在 Ramda 官網很明確顯示 merge() 已屬於 deprecated,雖然目前還能使用,是否有建議替代方案呢 ?

mergeRight()

import { mergeRight } from 'ramda'

let left = {
  title: 'FP in JavaScript',
  price: 100
}

let right = {
  price: 200
}

mergeRight(left, right) // ?

Ramda 亦提供了 mergeRight() 取代 merge()

mergeRight()
{k: v} -> {k: v} -> {k: v}

將兩個 object 合併,若 property 相同,則第二個 object 的 property 蓋掉第一個 object

{k: v}:第一個 object

{k: v}:第二個 object

{k: v}:回傳合併後的 object

可以發現 merge()mergeRight() 功能完全一樣,也因此 merge() 被列入 deprecated,將以 mergeRight() 取代 merge()

merge002

Conclusion

  • merge() 雖然仍可使用,但建議以 mergeRight() 取代 merge()

Reference

Ramda, merge()
Ramda, mergeRight()