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的建议就是这样!