Ramda,检查字符串是否有效

时间:2019-05-17 09:17:51

标签: javascript ecmascript-6 ramda.js

有效值:

  • 是字符串还是数字(R.is(string),R.is(number)
  • 不等于'-'和'$'和'0'
  • 不是null,false,undefined或NaN(Number.isNaN)

我如何使用ramda对此功能进行const isValid = ...

where函数关闭了https://ramdajs.com/docs/#where。但是它只接受和反对,您可以在其中检查每个道具。

both函数仅接受两个参数。

4 个答案:

答案 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)

首先,请注意您的某些规则是多余的。由于必须是字符串或数字,因此它已经不能是nullfalseundefined。因此,您的逻辑可以更简单。

我建议在这里将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)));