Ramda:通过其(数组)属性复制对象

Den*_*ger 2 javascript functional-programming ramda.js

我有一个具有数组属性的对象,{ property: [a, b] }我希望有一个重复对象列表[{ property: [a] }, { property: [b] }]

输入是:

const input = {
  url: 'getting-started',
  locales: ['en-GB', 'en-JP']
}
Run Code Online (Sandbox Code Playgroud)

预期的形式是:

const expected = [{
  url: 'getting-started',
  locales: ['en-GB']
}, {
  url: 'getting-started',
  locales: ['en-JP']
}]
Run Code Online (Sandbox Code Playgroud)

我写的函数有点难以理解,甚至不是纯粹的:

const duplicateByLocales = article => R.pipe(
  R.prop('locales'),
  R.invert,
  R.mapObjIndexed((val, locale) =>
    R.pipe(
      R.clone,
      R.assoc('locales', R.of(locale))
    )(article)),
  R.values
)(article)
Run Code Online (Sandbox Code Playgroud)

它确实有效,但我很好奇一个更好的方式是什么样的?谢谢!

Tit*_*tus 5

你可以这样做:

const input = {
  url: 'getting-started',
  locales: ['en-GB', 'en-JP']
}

let result = input.locales.map(locale => ({...input, locales:[locale]}));
console.log(result);
Run Code Online (Sandbox Code Playgroud)

请记住,{...input}创建一个浅的副本input.如果input有多个级别,这会变得有点复杂.

我们可以为它编写一个函数

const transform = input =>
  input.locales.map(locale => ({...input, locales:[locale]}))

console.log(transform({
  url: 'getting-started',
  locales: ['en-GB', 'en-JP']
}))
Run Code Online (Sandbox Code Playgroud)