R.all与R.both为什么不相同R.allPass使用相同的参数?

时间:2017-09-03 09:14:50

标签: ramda.js

我在做ramda.js时正在学习。好吧,有很多方法可以达到ramda的目标,但有一些我不明白的事情。

我想检查输入是否匹配一个正则表达式的字符串数组。我以为我可以这样做R.all(R.both(isString, isRegExp)),但是当输入是一个数字时,它似乎会传递true。 正如预期的那样,R.allPass([isString, isRegExp])会为false提供一个数字输入。

但有人可以解释一下为什么R.all会回归真实吗?或者错误(在思考中)是什么和哪里?

完整代码:

var isString = R.is(String),
  isMyRegExp = R.test(/^[a-z]+$/),
  isMyRegExpString = R.both(isString, isMyRegExp),
  isArrayOfMyRegExpStrings = R.all(isMyRegExpString),
  isArrayOfMyRegExpStringsPass = R.allPass([isString, isMyRegExp]),
  result = {
    'all': isArrayOfMyRegExpStrings(9),
    'allPass': isArrayOfMyRegExpStringsPass(9)
};
console.log(result);

// {
//   all: true,
//   allPass: false
// }

https://codepen.io/Eisenhardt/pen/PKLZqj

PS: 我知道我可以用正则表达式来缩短条件,但是在其他情况下我需要两个条件都是真的。例如。 isArrayOfNumber和sumOfNumbersOver50。

1 个答案:

答案 0 :(得分:1)

R.all的第二个参数是期望要测试的值列表。由于函数的实现方式,它将您的示例中的9视为空列表,从而生成vacuous truth并评估为true