带GTE条件的Ramda过滤器数据

问题描述 投票:0回答:1

我有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
javascript conditional-statements filtering ramda.js
1个回答
2
投票

我认为你的尝试显示了你对如何使用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的过滤器" 使得这句话的可读性和想象的一样高

© www.soinside.com 2019 - 2024. All rights reserved.