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>
我仍在磨练 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>