點燈坊

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

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

Sam Xiao's Avatar 2020-03-15

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

Version

macOS Mojave 10.15.3
VS Code 1.43.0
Quokka 1.0.282
Ramda 0.27.0

ECMAScript

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

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

let right = {
  price: 200
}

mergeLeft(left, right) // ?

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

mergeleft000

Functional

import { mergeRight, flip } from 'ramda'

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

let right = {
  price: 200
}

let mergeLeft = flip(mergeRight)

mergeLeft(left, right) // ?

mergeLeft() 其實可由 mergeRight() 藉由 flip() 翻轉 argument 而產生。

mergeleft001

Ramda

import { mergeLeft } from 'ramda'

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

let right = {
  price: 200
}

mergeLeft(left, right) // ?

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

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

{k: v}:第一個 object

{k: v}:第二個 object

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

mergeleft002

Conclusion

  • mergeLeft()mergeRight() 差異只有 argument 相反,因此可藉由 flip() 轉換即可

Reference

Ramda, mergeLeft()
Ramda, mergeRight()
Ramda, flip()