更新几个属性

时间:2016-07-27 09:22:54

标签: ramda.js

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}

2 个答案:

答案 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.lensPropR.overR.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)

的简写