#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>