2016-06-29 1 views
1

Vous cherchez un équivalent lodash de Ramda's evolve:Quel est l'équivalent lodash/fp de la fonction 'evolve' de Ramda?

const transformForDisplay = (item) => { 
    const transform = { 
    body: truncate({ length: 100 }), 
    title: truncate({ length: 50 }) 
    } 

    return R.evolve(transform, item) 
} 

qui retourne un objet contenant tous les champs d'origine de « point », mais tronquer les champs « corps » et « titre » si elles existent.

Editer: cela fonctionne. Quelque chose de plus concis?

const transformForDisplay = (item) => { 
    const transform = { 
    body: truncate, 
    title: truncate 
    } 

    const mapValuesWithKey = _.mapValues.convert({ cap: false }) 
    return mapValuesWithKey((x, key) => transform[key] ? transform[key](x) : x)(item) 
} 

Répondre

3

Je n'ai pas trouvé d'équivalent intégré. Voici comment vous pouvez implémenter evolve vous-même.

C'est à peu près ce que vous aviez déjà, sauf que j'ai utilisé _.getOr pour éviter d'avoir à répéter transform[key], et j'ai ajouté un appel récursif à evolve si nécessaire.

// Implementation  
 

 
const mapValuesWithKey = _.mapValues.convert({cap: false}); 
 

 
function evolve(transformations) { 
 
    return item => 
 
    mapValuesWithKey((value, key) => { 
 
     const transformation = _.getOr(_.identity)(key)(transformations); 
 
     const type = typeof transformation; 
 
     return type === 'function' ? 
 
     transformation(value) : 
 
     transformation && type === 'object' ? 
 
      evolve(transformation)(value) : 
 
      value; 
 
    })(item); 
 
} 
 

 
// Example  
 

 
const tomato = { 
 
    firstName: ' Tomato ', 
 
    data: {elapsed: 100, remaining: 1400}, 
 
    id: 123 
 
}; 
 
const transformations = { 
 
    firstName: _.trim, 
 
    lastName: _.trim, // Will not get invoked. 
 
    data: {elapsed: _.add(1), remaining: _.add(-1)}, 
 
    id: null, // Will have no effect. 
 
} 
 
const result = evolve(transformations)(tomato); 
 
console.log(result);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script> 
 
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.fp.min.js"></script>

+0

Merci, que/est/plus proche de la (https://github.com/ramda/ramda/blob/master/src/evolve.js#L31) [mise en œuvre Ramda] . Je suppose que la réponse est qu'il n'y a pas d'équivalent direct? –

+1

@NickCox J'ai expliqué que je ne connais aucun équivalent. Merci pour le lien avec la mise en œuvre de Ramda; il a exposé quelques cas d'angle. –