Преобразование объекта с новым свойством, полученным из исходных свойств в ramda - PullRequest
3 голосов
/ 01 августа 2020

Как проще всего преобразовать следующий объект?

// original
{ 
  name: "bob", 
  age: 24 
} 

// result
{ 
  name: "bob", 
  age: 24, 
  description: "bob is 24 years old" 
}

Я могу использовать линзу для обновления одного свойства, например увеличения возраста. Но я не уверен, как go преобразовать несколько свойств в одно.

1 Ответ

4 голосов
/ 01 августа 2020

Вы можете использовать R.applySpe c для создания объекта с производным свойством. Чтобы объединить его с исходным объектом, используйте R.chain и R.merge (я использовал R.mergeLeft, чтобы сделать его последним свойством).

Применение R.chain к функциям (chain(f, g)(x)) - это эквивалент f(g(x), x). В этом случае x - это исходный объект, g - это R.applySpe c (создать объект из x), а f - это R.mergeLeft (mergeLeft g(x) и x).

const { chain, mergeLeft, applySpec } = R

const getDescription = ({ name, age }) => `${name} is ${age} years old`

const fn = chain(mergeLeft, applySpec({
  description: getDescription,
}))

const result = fn({
  name: "bob", 
  age: 24 
})

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

Без Ramda вы можете получить тот же результат, используя расширение объекта, чтобы включить исходные свойства объекта:

const getDescription = ({ name, age }) => `${name} is ${age} years old`

const fn = o => ({
  ...o,
  description: getDescription(o),
});

const result = fn({
  name: "bob", 
  age: 24 
})

console.log(result)
...