RamdaJS 如何使用 R.find 和 R.or?

RamdaJS How to use R.find with R.or?

我仍在磨练 ramda 并努力学习基础知识。

我想找到第一个设置了许多属性的对象。因此,我正在尝试将查找与 or 一起使用,但无论我如何构建它,我似乎都无法让它工作。 repl.it

var xs = [{a: 1}, {b: 2}, {a: 3}];
R.find(R.or(R.prop('c'), R.prop('b')))(xs);

我原以为它的计算结果为 {b:2} 但它一直返回未定义。我在这里做错了什么?

在这种情况下,您需要 R.either,它采用两个布尔生成函数,而 R.or 只是期望两个布尔值进行比较(实际上是 (a, b) => a || b 的柯里化形式)。

我不会使用 prop 来测试对象是否具有 属性,因为如果 属性 设置为假值,它会 return 假阴性. (请改用 has。)此外,如果您有两个以上的条件,您可能需要考虑使用 anyPass 而不是 either

const findObject =
  R.find(R.__, [
    {a: 0},
    {b: 1},
    {c: 1}]);


// probably not the result you expected
findObject(
  R.anyPass([
    R.prop('a'),
    R.prop('b')])); //=> {b: 1}

// most likely the result you expected
findObject(
  R.anyPass([
    R.has('a'),
    R.has('b')])); //=> {a: 0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>