在ramda
中如何一次更新多个属性?我能得到的最接近的是使用R.evolve()
。 evolve
希望我使用转换函数修改属性。我想直接做。但是,R.assoc()
允许我一次只修改一个属性,我必须使用字符串指定属性。
这就是我现在使用evolve
:
const STATE_INITIAL = {
isDisabled: true,
isLoading: false
};
R.evolve({
isDisabled: R.not,
isLoading: () => true // I don't want to set a value using a function
}, state)
在JS中我会object-spread
运算符,我会收到一个新对象:
{ ...state, isDisabled: !state.isDisabled, isLoading: true}
答案 0 :(得分:1)
一种选择是使用镜片:
select Status, count(Status) as cnt, t.total
from assigntask
cross join (
SELECT count(Status) as total from assigntask
) t
group by status
请参阅R.lensProp
,R.over
和R.set
。
答案 1 :(得分:1)
拉姆达试图保持简单,所以不太可能是一种好的技术,可以让你为一个属性使用一个函数,为另一个属性使用一个值,除非像大卫钱伯斯所说的那样管它们。他的版本也可以写成:
const toggle = R.pipe(
R.over(R.lensProp('isDisabled'), R.not),
R.set(R.lensProp('isLoading'), true)
)
肯定比
更冗长const toggle = state => {
...state,
isDisabled: !state.isDisabled,
isLoading: true
}
但它看起来并不那么糟糕。但是,如果您对两个属性使用函数的反对意见不是很强,那么原始版本evolve
的变体很简单:
const toggle = R.evolve({
isDisabled: R.not,
isLoading: R.T
})
R.T
只是R.always(true)