代码之家  ›  专栏  ›  技术社区  ›  corvid

ramda:根据对象的当前状态设置对象

  •  0
  • corvid  · 技术社区  · 6 年前

    我想有一个管道,将设置一个位置对象。假设location对象如下所示:

    {
      pathname: '/users',
      search: 'sort=desc&sortBy=name',
      hash: '',
      state: {},
    }
    

    在管道的第一步,我想设置 state.redirect 其中一个是当前对象,但没有 state 包括。例如。,

    {
      pathname: '/users',
      search: 'sort=desc&sortBy=name',
      hash: '',
      state: {
        redirect: {
          pathname: '/users',
          search: 'sort=desc&sortBy=name',
          hash: '',
        }
      }
    }
    

    我从以下几点开始,但没有真正起作用。

    set(lensProp('state'), /* ??? */)

    2 回复  |  直到 6 年前
        1
  •  1
  •   Scott Sauyet    6 年前

    这应该做到:

    const loc = {
      pathname: '/users',
      search: 'sort=desc&sortBy=name',
      hash: '',
      state: {},
    }
    
    console.log(R.dissoc('state', loc))
    <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

    What Function Should I Use? 可能有助于找到这样的函数。

        2
  •  0
  •   Matías Fidemraizer    6 年前

    下面的方法呢?

    const input = {
      pathname: '/users',
      search: 'sort=desc&sortBy=name',
      hash: '',
      state: {},
    }
    
    const { lensProp, set, over, dissoc, pipe } = R
    
    // The W combinator to apply twice the same input to a binary function
    // W :: (a -> a -> b) -> a -> c
    const W = f => x => f (x) (x)
    
    // stateLens :: a -> b
    const stateLens = lensProp ('state')
    
    // Note how W will apply the input twice: it'll set the input
    // to 'state' property!
    // setSelfState :: (Object -> Object -> Object) -> Object -> Object
    const setSelfState = W (set (stateLens))
    
    // dissocInnerState :: Object -> Object
    const dissocInnerState = over (stateLens) (dissoc ('state'))
    
    // setSelftState :: Object -> Object
    const setSelfState_ = pipe (
      setSelfState,
      dissocInnerState
    )
    
    const output = setSelfState_ (input)
    
    console.log (output)
    <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>