使用Ramda转换对象无点样式

时间:2016-08-08 16:41:44

标签: ramda.js

鉴于以下功能,如何将其转换为无点样式?很高兴使用Ramda的proppath并跳过数据参数,但我无法弄清楚正确的语法。

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

2 个答案:

答案 0 :(得分:14)

一个选项是使用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>

答案 1 :(得分: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