Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ramda:按对象的(数组)属性复制对象_Javascript_Functional Programming_Ramda.js - Fatal编程技术网

Javascript Ramda:按对象的(数组)属性复制对象

Javascript Ramda:按对象的(数组)属性复制对象,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我有一个对象具有数组属性{property:[a,b]},我希望有一个重复对象列表,其中[{property:[a]},{property:[b]}] 输入为: const input = { url: 'getting-started', locales: ['en-GB', 'en-JP'] } 预期形式为: const expected = [{ url: 'getting-started', locales: ['en-GB'] }, { url: 'getting

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

输入为:

const input = {
  url: 'getting-started',
  locales: ['en-GB', 'en-JP']
}
预期形式为:

const expected = [{
  url: 'getting-started',
  locales: ['en-GB']
}, {
  url: 'getting-started',
  locales: ['en-JP']
}]
我编写的函数有点不可读,甚至不纯粹:

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)

它确实有效,但我很好奇,更好的方法是什么样的?谢谢大家!

您可以这样做:

const输入={
url:“入门”,
地区:['en-GB','en-JP']
}
让result=input.locales.map(locale=>({…input,locales:[locale]}));

控制台日志(结果)我已编辑您的问题以修复代码格式。作为将来的参考,SO不使用通常的标记约定进行格式化:代码块是通过将所有内容缩进4个空格来标记的(我知道,这很奇怪)。你也可以突出显示代码块并点击ctrl-k(mac上的cmd-k),它会帮你完成。为什么输出有
语言环境:['en-GB']
而不是
语言环境:'en-GB'
?@ScottSauyet你说得对,它应该是
语言环境:'en-GB'
!在我的endNice上有一个疏忽,我从来没有想过在传播之后会像那样覆盖密钥。令人惊讶的是,它没有在严格模式下运行,但显然没有(只是在chrome的严格模式IILife中尝试过)。谢谢你,这绝对是一个改进,但我试图找到一种纯粹的方法,你的函数引用了外部上下文(使用
…input
)。因此,我认为理想情况下,函数将获取对象,并返回一个数组。这不是一个函数,而是一个表达式。通过类似于
const-tranform=input=>input.locales.map(…)
的方法将其转换为一个函数。如果您更喜欢
locale:'en-JP'
而不是
locales:['en-JP']
结果对象列表中的
transform
函数,您可以在答案中稍微像这样调整
({locales,…rest})=>locales.map(locale=>({locale,…rest}))