Functional programming Ramda applySpec-保留未修改的道具

Functional programming Ramda applySpec-保留未修改的道具,functional-programming,ramda.js,Functional Programming,Ramda.js,假设我有一个对象constfoo={a:1,b:2},我想添加一个基于b的属性c 我可以做到: applySpec({ a: prop('a'), b: prop('b'), c: ({ b }) => b + 1 }, foo) 然后得到如下对象:{a:1,b:2,c:3} 有更好的方法吗 我看过evolve、assoc和applySpec,但它们似乎都不适合使用。您可以使用R.chain创建一个应用规范的函数,然后将新对象与原始对象合并 如果R.chain与函

假设我有一个对象
constfoo={a:1,b:2}
,我想添加一个基于b的属性c

我可以做到:

applySpec({
    a: prop('a'),
    b: prop('b'),
    c: ({ b }) => b + 1
}, foo)
然后得到如下对象:
{a:1,b:2,c:3}

有更好的方法吗


我看过evolve、assoc和applySpec,但它们似乎都不适合使用。

您可以使用R.chain创建一个应用规范的函数,然后将新对象与原始对象合并

如果R.chain与函数(
f
&
g
)一起使用:
链(f,g)(x)
相当于
f(g(x),x)

在这种情况下,
chain(mergeLeft,applySpec({}))
等于
mergeLeft(applySpec({}),originalObject)

const{chain,mergeLeft,applySpec}=R
常数fn=链(合并左,applySpec({
c:({b})=>b+1
}))
常量foo={a:1,b:2}
常数结果=fn(foo)
console.log(结果)

您可以使用R.chain创建应用规范的函数,然后将新对象与原始对象合并

如果R.chain与函数(
f
&
g
)一起使用:
链(f,g)(x)
相当于
f(g(x),x)

在这种情况下,
chain(mergeLeft,applySpec({}))
等于
mergeLeft(applySpec({}),originalObject)

const{chain,mergeLeft,applySpec}=R
常数fn=链(合并左,applySpec({
c:({b})=>b+1
}))
常量foo={a:1,b:2}
常数结果=fn(foo)
console.log(结果)

这太棒了!你知道如何命名这个漂亮的函数“fn”吗?:)我有一个融合applySpec和identity的想法,但这要干净得多(Y),我是一个糟糕的名字。类似于
enhanceSpec
的东西。这太棒了!我们可能会窃取这个想法,把它放进拉姆达!命名建议:带Spec、mergeSpec、ApplySpect这真是太棒了!你知道如何命名这个漂亮的函数“fn”吗?:)我有一个融合applySpec和identity的想法,但这要干净得多(Y),我是一个糟糕的名字。类似于
enhanceSpec
的东西。这太棒了!我们可能会窃取这个想法,把它放进拉姆达!命名建议:withSpec、mergeSpec、,applySpec@OriDrori答案很好。你有没有考虑过
o=>({…o,c:o.b+1})
?是的,我可以“手动”完成,但我正在考虑一种更通用的方法,用更复杂的对象和函数来完成。OriDroris的建议就是这样@Oridori的答案非常好。你有没有考虑过
o=>({…o,c:o.b+1})
?是的,我可以“手动”完成,但我正在考虑一种更通用的方法,用更复杂的对象和函数来完成。OriDroris的建议就是这样!