2016-08-08 10 views
2

Wie kann ich die folgende Funktion in Point-Free-Stil konvertieren? Wäre schön, Ramdas prop und path zu verwenden und das Datenargument zu überspringen, aber ich kann einfach nicht die richtige Syntax herausfinden.Transformieren Sie Objekte pointfree Stil mit Ramda

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

Antwort

8

Eine Option wäre, R.applySpec zu verwenden, die eine neue Funktion erstellt, die Objekte erstellt, indem die Funktionen bei jeder Schlüssel der angegebenen "Spezifikation" gegen die gegebenen Argumente der resultierenden Funktion anwenden.

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

Hier ist mein Versuch:

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

[Bearbeiten] Wir es völlig Punkt frei machen:

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