我有JSON的数据
{
"date": "2019-12-17",
"installs": 1,
},
{
"date": "2019-12-02",
"installs": 5
},
{
"date": "2019-12-02",
"installs": 4
}
....
我需要通过一个字段的gt条件来过滤(例如,安装)。
我尝试用这个代码。
let f = R.filter(R.propIs(true, R.gte(R.prop('installs'), 2)), data);
console.log(f)
但得到了错误
TypeError: Right-hand side of 'instanceof' is not an object
我认为你的尝试显示了你对如何使用Ramda的功能构成思想的一些困惑。 可能最接近你的工作版本是这样的。
filter(pipe (prop ('installs'), gte (__, 2), equals (true)), data)
我将把传递给我的函数拉出来并命名为: filter
供我们讨论。 如果你没有其他用途,当然以后可以再内联。
const enoughInstalls = pipe (prop ('installs'), gte (__, 2), equals (true))
filter (enoughInstalls) (data)
请注意,当我们要创建一个函数,将数据从一个函数传递到另一个函数时,我们不要用类似于 gte(prop('installs'), 2)
. 因为 prop('installs')
是一个 功能这将需要通过一个 功能 作为第一个参数,以 gte
. 当然你需要传递一个数字来代替。 当我们要传递的是 结果 的一个函数调用到另一个函数,我们使用函数合成,通常使用Ramda的 compose
或其 pipe
. 我们将在这里做后者,但 compose
相当相似,只是参数反过来了。
所以把 gte(prop('installs'), 2)
我们用 pipe(prop('installs'), gte(__, 2))
. 返回一个函数,该函数将其参数传递给 prop('installs')
并将该调用的结果传递给 gte(__, 2)
. 上面还有一个电话在打。equals(true)
. 这是想配合你的 propIs
的想法。 但事实证明完全没有必要。 gte
会返回一个布尔值。 所以添加 equals(true)
简单地返回相同的布尔值。 所以这可以简化为。
const enoughInstalls = pipe (prop ('installs'), gte (__, 2))
现在说的是要抓住这个属性 installs
从我们的输入对象中传给谓词函数 gte(__, 2)
. 但有一个内置的功能。propSatisfies
. 我们可以把这个改写成。
const enoughInstalls = propSatisfies (gte (__, 2), 'installs')
这是一个非常合理的解决方案。 但实际上我更喜欢Nick Parsons在评论中建议的版本。 对于这个版本,我真的更喜欢内联在下面的 filter
调用。
const myFilter = filter (where ({installs: gte(__, 2)})
大声读成 "安装量大于或等于2的过滤器" 使得这句话的可读性和想象的一样高