【问题标题】:Transform objects pointfree style with Ramda使用 Ramda 变换对象的无点样式
【发布时间】:2016-08-09 07:48:13
【问题描述】:

给定下面的函数,如何将其转换为无点样式?使用 Ramda 的 proppath 并跳过 data 参数会很好,但我无法弄清楚正确的语法。

const mapToOtherFormat = (data) => (
    {
        'Name': data.Name
        'Email': data.User.Email,
        'Foo': data.Foo[0].Bar
    });

【问题讨论】:

    标签: ramda.js


    【解决方案1】:

    一种选择是使用R.applySpec,它创建一个新函数,通过将提供的“规范”的每个键处的函数应用于结果函数的给定参数来构建对象。

    const mapToOtherFormat = R.applySpec({
      Name: R.prop('Name'),
      Email: R.path(['User', 'Email']),
      Foo: R.path(['Foo', 0, 'Bar'])
    })
    
    const result = mapToOtherFormat({
      Name: 'Bob',
      User: { Email: 'bob@example.com' },
      Foo: [{ Bar: 'moo' }, { Bar: 'baa' }]
    })
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.22.1/ramda.min.js"></script>

    【讨论】:

      【解决方案2】:

      这是我的尝试:

      const mapToOtherFormat = R.converge(
          (...list) => R.pipe(...list)({}),
          [
            R.pipe(R.view(R.lensProp('Name')), R.set(R.lensProp('Name'))),
            R.pipe(R.view(R.compose(R.lensProp('User'), R.lensProp('Email'))), R.set(R.lensProp('Email'))),
            R.pipe(R.view(R.compose(R.lensProp('Foo'), R.lensIndex(0), R.lensProp('Bar'))), R.set(R.lensProp('Foo')))
          ]
        )
      
      const obj = {Name: 'name', User: {Email: 'email'}, Foo: [{Bar: 2}]}
      mapToOtherFormat(obj)
      

      Ramda console

      [编辑] 我们可以让它完全无点:

      const mapToOtherFormat = R.converge(
          R.pipe(R.pipe, R.flip(R.call)({})),
          [
            R.pipe(R.view(R.lensProp('Name')), R.set(R.lensProp('Name'))),
            R.pipe(R.view(R.compose(R.lensProp('User'), R.lensProp('Email'))), R.set(R.lensProp('Email'))),
            R.pipe(R.view(R.compose(R.lensProp('Foo'), R.lensIndex(0), R.lensProp('Bar'))), R.set(R.lensProp('Foo')))
          ]
        )
      

      Ramda console

      【讨论】:

        猜你喜欢
        • 2018-06-23
        • 1970-01-01
        • 2016-08-30
        • 2017-10-07
        • 2018-12-07
        • 2017-04-20
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多