按 Ramda.js 复合 AND 条件拒绝数组项

Reject array items by Ramda.js composite AND condition

我想 reject 使用 Ramda.js 库排列项目。

有两个属性等于0的物品需要移除。 是否可以使用普通 Ramda.js 函数来实现 without lambdas

我希望收到名称为 A, B, C 的商品(除了 D,其中 accbal 都等于 0),但是我的示例 returns A, C.

const arr = [
  {
    name: 'A',
    acc: 1,
    bal: 2,
  },
  {
    name: 'B',
    acc: 3,
    bal: 0,
  },
  {
    name: 'C',
    acc: 0,
    bal: 4,
  },
  {
    name: 'D',
    acc: 0,
    bal: 0,
  }
]

const filteredItems = R.reject(
  R.and(
    R.propEq('acc', 0),
    R.propEq('bal', 0)
  )
)(arr)

这是Ramda REPL to test my example

提前感谢您的帮助!

在 Ramda 库中,R.and 方法 returns 一个布尔值,相比之下,R.reject 方法期望使用一个可迭代对象来遍历提供的数组。您可以使用 R.allPass 方法实现此目的。此方法采用谓词数组(如 R.propEq)和 returns 一个使用 "AND" 逻辑组合它们的谓词。

R.reject(
    R.allPass([
        R.propEq('acc', 0),
        R.propEq('bal', 0)
    ])
)(arr);

注意:如果要使用"OR"逻辑,可以使用R.anyPass代替。

使用 R.allPass/R.bothR.propEq 的替代方法是 R.where,它需要 "spec object" 和 returns true 如果所有属性满意。

R.reject(R.where({
  acc: R.equals(0),
  bal: R.equals(0)
}))