синхронизировать два объекта и применять новые значения - PullRequest
3 голосов
/ 13 апреля 2019

Чего я хочу достичь, так это:

R.mergeDeepRight(
  { age: 40, contact: { email: 'baa@example.com' }},
  { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}
);

, но без { name: 'fred' } в результирующем объекте.

Должны применяться только ключи в первом объекте.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Вы можете использовать пропустить после mergeDeepRight , чтобы опустить нежелательные ключи

let obj1 = { age: 40, contact: { email: 'baa@example.com' }}
let obj2 = { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}

let ommitKeys = Object.keys(obj2).filter(key=> !obj1[key])

let concatValues = (k, l, r) =>  k == 'values' ? R.concat(l, r) : r

let output = R.omit(ommitKeys, R.mergeDeepRight(concatValues, obj1, obj2,))


console.log(output)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

Демо

Здесь переменная ommitedKeys содержит все ключи, которых нет в Object1,

Альтернативой является использование Pick

let obj1 = { age: 40, contact: { email: 'baa@example.com' }}
let obj2 = { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}

let desiredKeys = Object.keys(obj1)

let concatValues = (k, l, r) =>  k == 'values' ? R.concat(l, r) : r

let output = R.pick(desiredKeys, R.mergeDeepRight(concatValues, obj1, obj2,))


console.log(output)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
1 голос
/ 13 апреля 2019

Я бы сделал функцию многократного использования, объединяющую mergeDeepRight, pick и keys, например:

const funkyMerge = (o1, o2) =>   
  mergeDeepRight(o1, pick(keys(o1), o2))

console.log(funkyMerge(
  { age: 40, contact: { email: 'baa@example.com' }},
  { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}
))
<script src="https://bundle.run/ramda@0.26.1"></script><script>
const {mergeDeepRight, pick, keys} = ramda      </script>
...