2016-08-08 2 views
2

Учитывая приведенную ниже функцию, как ее преобразовать в бесконтактный стиль? Было бы неплохо использовать Ramda's prop и path и пропустить аргумент данных, но я просто не могу понять правильный синтаксис.Преобразовать объекты в стиле pointfree с помощью Ramda

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

ответ

8

Одним из вариантов было бы использовать 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: '[email protected]' }, 
 
    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

Смежные вопросы