2016-08-08 2 views
2

J'apprends FP et essayer de comprendre cela:Ramda.js créer une fonction de filtre par la valeur de l'objet

J'ai une liste d'utilisateurs et la nécessité de créer une fonction pour les filtrer par nom. Voilà ce que j'ai essayé:

let users = [{name: "rod"}] 

let nameEq = R.prop("name") 

let filterByName = R.compose( 
    R.filter(R._, users), 
    nameEq 
); 

filterByName("rod") 

Cela ne fonctionne pas parce que filter retourne un tableau. Je suppose que je dois curry filter d'une certaine façon, mais ne peux pas le comprendre.

+0

oui, vous étiez v.close - vous souhaitiez appliquer partiellement le filtre, mais comme les données sont en dernier, vous pouvez utiliser R.partialRight - http://ramdajs.com/0.22.1/docs/#partialRight – arcseldon

Répondre

3

Si vous êtes à la recherche d'une sorte point free de style, que diriez-vous de cette approche:

const R = require('ramda'); 

// sample data 
const data = [{name: 'rod', age: 25}, {name: 'chuck', age: 30}, {name: 'rod', age: 50}]; 


// Alternative 1: bake in the name and vary the data 

const filterByName = R.compose(R.filter, R.propEq('name')); 

const filterByRod = filterByName('rod'); 

// now supply the data 
filterByRod(data); // => [ { name: 'rod', age: 25 }, { name: 'rod', age: 50 } ] 


// Alternative 2: bake in the data, and then vary the name 

const filterDataByName = R.compose(R.partialRight(R.filter, [data]), R.propEq('name')); 

// now supply the name 
filterDataByName('rod'); // => [ { name: 'rod', age: 25 }, { name: 'rod', age: 50 } ] 

vous visiez Croyez faire Alternative 2 ci-dessus dans votre question.

+0

Mise à jour de la réponse offrir deux alternatives en fonction des besoins. – arcseldon