Рамда, проверь, верна ли строка - PullRequest
0 голосов
/ 17 мая 2019

Допустимое значение:

  • Строка или число (R.is (строка), R.is (число)
  • Не равно '-' и '$' и '0'
  • Не является нулевым, ложным, неопределенным или NaN (Number.isNaN)

Как мне сделать const isValid = ... функцию этого с помощью ramda?

Функция where близка https://ramdajs.com/docs/#where. Но она принимает и только объект, где вы можете проверить каждую опору.

Функция both принимает только два аргумента.

Ответы [ 4 ]

2 голосов
/ 17 мая 2019

Вы все еще можете использовать 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 голос
/ 17 мая 2019

Прежде всего, обратите внимание, что некоторые из ваших правил являются избыточными. Поскольку это должна быть строка или число, оно уже не может быть 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 без баллов выглядит менее простой для меня. Это не ужасно, но я бы не стал его выбирать, даже если написать довольно просто:

const isValid = both (
  either ( is (String), is (Number) ), 
  complement (includes (__, [NaN, '-', '$', '0'] ) )
)
0 голосов
/ 17 мая 2019

Это использует Рамду так, как я могу думать:

const isValid = arg => R.both(R.is(String, arg) || R.is(Number, arg), R.both(R.not(R.includes(arg, ["$", "-", "0"])), R.not(arg)));
0 голосов
/ 17 мая 2019

Эту задачу лучше решить простым 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 могло бы улучшить это.

...