Ramda.js按对象值创建过滤函数

时间:2016-08-08 04:41:04

标签: javascript func ramda.js

我正在学习FP并尝试解决这个问题:

我有一个用户列表,需要创建一个按名称过滤它们的函数。这就是我的尝试:

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

let nameEq = R.prop("name")

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

filterByName("rod")

这不起作用,因为filter返回一个数组。我想我需要在某种程度上讨论filter,但无法弄明白。

1 个答案:

答案 0 :(得分:3)

如果您正在寻找point free种风格,那么这种方法如何:

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 } ]

相信你的目标是在你的问题中做上面的备选方案2。