RamdaJS如何在R.or中使用R.find?

时间:2018-11-09 04:49:51

标签: ramda.js

我仍然在使用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},但它始终返回未定义的值。我在这里做什么错了?

2 个答案:

答案 0 :(得分:2)

在这种情况下,您需要使用两个布尔生成函数的R.either,而R.or只希望比较两个布尔值(有效的(a, b) => a || b的咖喱形式)。

答案 1 :(得分:1)

我不会使用prop来测试对象是否具有属性,因为如果将属性设置为伪造的值,它将返回false负数。 (改为使用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>