我喜欢实现尽可能通用和功能(如在函数式编程中),但一般来说,我期望json被以下结构所反对:
[
{
id: number,
prop1: string,
prop2: number,
prop3: string,
...,
propN: string
},
...
]
(基本上,包含N个属性的对象数组,一些映射到字符串,另一些映射到数字)
我正在尝试实现一组通用函数,以便我能够为此达到目的:
var filteredResult = filter(by(property, value, lt\gt\eq\contains), collection);
基本上,我想返回一个具有相同对象结构的数组,由我传入()的属性字符串过滤,以及值(字符串或数字)和比较类型i我想表演。
一般来说,对于数字,我希望能够过滤结果,其中属性值大于/小于我传递的值的范围,使用字符串或字符串数组,我想找出如果属性值包含我通过()传递的值。
由于我是FP的新手,我正在努力格式化我的代码以利用Ramda提供的自动调整功能,并且在传递我想要的参数时无法编写不同的函数。
例如,我写过这个函数:
var byProperty = function(p) {return R.useWith(R.filter, R.propEq(p), R.identity)};
但是当我尝试使用它时:
var property = 'prop1', value = 15;
console.log( byProperty( property, value, collection ) );
我得到一个函数而不是过滤后的数组。
我知道我在这里遗漏了一些微不足道的东西,但是我很难在Ramda传递价值和功能的方式。
答案 0 :(得分:1)
但是当我尝试像
console.log( byProperty( property, value, collection ) )
那样使用它时,我得到一个函数而不是过滤后的数组。
是的,因为您的函数只接受一个参数,并返回一个函数。你可以像这样调用它:
console.log( byProperty(property)(value, collection) );
但这可能不是你想要的。此外,我认为此处useWith
是错误的工具,您只需要compose
:
var byProperty = R.compose(R.filter, R.propEq);
虽然仍然需要像
那样调用console.log( byProperty(property, value)(collection) );
这有an open issue,但是curi和组合可变参数函数并不是一件容易的事。你得到的最好的可能是
var byProperty = R.curryN(3, function(p, v, c) { return R.filter(R.propEq(p, v), c); });