使用 Ramda 转换对象 pointfree 样式

Transform objects pointfree style with Ramda

给定以下功能,如何将其转换为无点样式?使用 Ramda 的 proppath 并跳过数据参数会很好,但我就是想不出正确的语法。

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

这是我的尝试:

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

一个选项是使用 R.applySpec,它创建一个新函数,该函数通过在所提供的 "spec" 的每个键处应用函数来构建对象,并针对结果函数的给定参数.

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>