同步两个对象并应用新值

问题描述 投票:3回答:2

我想要实现的基本上是这样的:

R.mergeDeepRight(
  { age: 40, contact: { email: '[email protected]' }},
  { name: 'fred', age: 10, contact: { email: '[email protected]' }}
);

但在结果对象中没有{ name: 'fred' }

只应应用第一个对象中的键。

javascript object ramda.js
2个回答
1
投票

我会把mergeDeepRightpickkeys组合成一个可重用的函数,如下所示:

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

console.log(funkyMerge(
  { age: 40, contact: { email: '[email protected]' }},
  { name: 'fred', age: 10, contact: { email: '[email protected]' }}
))
<script src="https://bundle.run/[email protected]"></script><script>
const {mergeDeepRight, pick, keys} = ramda      </script>

2
投票

您可以在omit之后使用mergeDeepRight来省略不需要的密钥

let obj1 = { age: 40, contact: { email: '[email protected]' }}
let obj2 = { name: 'fred', age: 10, contact: { email: '[email protected]' }}

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>

Demo

这里ommitedKeys变量包含Object1中不存在的所有键,

替代是使用Pick

let obj1 = { age: 40, contact: { email: '[email protected]' }}
let obj2 = { name: 'fred', age: 10, contact: { email: '[email protected]' }}

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>
© www.soinside.com 2019 - 2024. All rights reserved.