有效值:
我如何使用ramda对此功能进行const isValid = ...
?
where
函数关闭了https://ramdajs.com/docs/#where。但是它只接受和反对,您可以在其中检查每个道具。
both
函数仅接受两个参数。
答案 0 :(得分:2)
如果您将类型检查和内容检查分开,则仍然可以使用both
:
const isValid = both(
either(is(String), is(Number)),
complement(anyPass([
isNil,
equals('0'),
equals('-'),
equals('$'),
equals(NaN),
equals(false)
]))
);
console.log(isValid([]));
console.log(isValid(1));
console.log(isValid(NaN));
console.log(isValid('foo'));
console.log(isValid('$'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {both, either, is, complement, anyPass, isNil, equals} = R;</script>
答案 1 :(得分:1)
首先,请注意您的某些规则是多余的。由于必须是字符串或数字,因此它已经不能是null
,false
或undefined
。因此,您的逻辑可以更简单。
我建议在这里将Ramda用于多个辅助函数,但也许不使用纯无点的Ramda函数。这似乎可以很好地捕获它:
const isValid = s =>
(is (String, s) || is (Number, s)) && ! includes (s, [NaN, '-', '$', '0'] );
['a', 'b', 42, false, NaN, null, '-', '-0', '$', {}].forEach(s =>
console.log(`${s} => ${isValid(s)}`)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script><script>
const {is, includes} = R </script>
相同代码的普通JS版本如下所示:
const isValid = s =>
(typeof s == 'string' || typeof s == 'number') && ! [NaN, '-', '$', '0'] .includes (s);
Ramda版本稍微简单一些,在我看来,它更具可读性。我绝不会因为这个小差异而将Ramda包括在内。但是,如果已经使用Ramda,则此版本有意义。
但是对我来说,完全免费的Ramda版本看起来少。这并不可怕,但是即使编写起来相当容易,我也不会选择它:
const isValid = both (
either ( is (String), is (Number) ),
complement (includes (__, [NaN, '-', '$', '0'] ) )
)
答案 2 :(得分:0)
使用普通JavaScript可以更好地解决此任务:
function isValid(value) {
if (typeof value !== 'string' && typeof value !== 'number')
return false;
if (value === '-' || value === '$' || value === '0')
return false;
if (value === null || value === false || value === undefined || Number.isNaN(value))
return false;
return true;
}
这很容易理解,代码较短。我不知道使用Ramda可以如何改善这一点。
答案 3 :(得分:0)
这会以我认为的多种方式使用Ramda:
const isValid = arg => R.both(R.is(String, arg) || R.is(Number, arg), R.both(R.not(R.includes(arg, ["$", "-", "0"])), R.not(arg)));