синхронизация двух объектов и применение новых значений

#javascript #object #ramda.js

#javascript #объект #ramda.js

Вопрос:

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

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

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

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

Комментарии:

1. Вам нужно решение с чистым js или только ramda?

2. любое решение будет оценено. Я подумал, что ramda лучше всего подходит для этой цели. Я должен был упомянуть, что я хочу опустить любой ключ во втором объекте, который не существует в первом. Я думаю, это сложно :/

3. @RaJoB вы можете отфильтровать ключи от второго объекта и вставить, omit( [ filtered keys]... или вы можете использовать просто выбрать, я тоже добавил это в ответ

Ответ №1:

Я бы создал повторно используемую функцию, объединяющую 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>  

Ответ №2:

Вы можете использовать omit after 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>  

k == ‘values’ ? R.concat(l, r) : r

R.omit([‘name’],mergeDeepRight(concatValues,
{ age: 40, contact: { email: ‘baa@example.com’ }},
{ name: ‘fred’, age: 10, contact: { email: ‘moo@example.com’ }},
))

//=> { a: true, b: true, c: { thing: ‘bar’, values: [10, 20, 15, 35] }}» rel=»nofollow noreferrer»>ДЕМОНСТРАЦИЯ

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

Альтернативный вариант — использовать выбор

 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>