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}))