#javascript #pointfree #ramda.js
#javascript #без точек #ramda.js
Вопрос:
При написании функции с капитализацией тривиально, так что:
«привет» => «Привет» «привет» => «Привет»
Как можно было бы написать ее, используя стиль без точек, используя Ramda JS?
Ответ №1:
Вы можете частично применить replace
регулярное выражение, которое выполняется toUpper
с первым символом:
const capitalize = R.replace(/^./, R.toUpper);
Комментарии:
1. Провел несколько быстрых и грязных тестов по предоставленным ответам, и ваш самый быстрый.
2. однако 2-й параметр
replace
— это строка, а не функция. У меня не работает3. @DamianGreen Ramda реализует
R.replace
собственный строковый метод javascript. 2-й аргумент тоже может быть функцией, см. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
Ответ №2:
Это было бы что-то вроде этого:
const capitalize = R.compose(
R.join(''),
R.juxt([R.compose(R.toUpper, R.head), R.tail])
);
Демонстрация (в ramdajs.com REPL).
И незначительные изменения для обработки null
значений
const capitalize = R.compose(
R.join(''),
R.juxt([R.compose(R.toUpper, R.head), R.tail])
);
const capitalizeOrNull = R.ifElse(R.equals(null), R.identity, capitalize);
Комментарии:
1. В качестве последующего вопроса, как бы вы обработали нулевой регистр при написании в стиле без точек? Если эта функция была вызвана с capitalize(null), она взорвется.
2. @TutanRamen добавьте к ней
ifElse(equals(null), identity,
, иначе я думаю, что именно здесьMaybe
monad станет полезным.3. Потрясающе! Можно даже вставить
isNil
вместоequals(null)
now!4. Комбинация
ifElse
identity
может быть заменена, возможно, более читаемойunless
функцией:const capitalizeIfNotNil = R.unless(R.isNil, capitalize);
Ответ №3:
Я предлагаю использовать R.lens
:
const char0 = R.lens(R.head, R.useWith(R.concat, [R.identity, R.tail]));
R.over(char0, R.toUpper, 'ramda');
// => 'Ramda'
Ответ №4:
Я собрал несколько быстрых и грязных тестов для всех, кто заинтересован. Похоже, что @lax4mike является самым быстрым из предоставленных ответов (хотя более простой, без точек str[0].toUpperCase() str.slice(1)
намного быстрее [а также не то, о чем просил OP, так что это спорно]).
https://jsfiddle.net/960q1e31 / (Вам нужно будет открыть консоль и запустить скрипку, чтобы увидеть результаты)
Ответ №5:
Для тех, кто, достигнув этого, ищет решение, в котором первая буква пишется заглавными буквами, а остальные буквы — строчными, вот оно:
const capitalize = R.compose(R.toUpper, R.head);
const lowercaseTail = R.compose(R.toLower, R.tail);
const toTitle = R.converge(R.concat, [capitalize, lowercaseTail]);
toTitle('rAmdA');
// -> 'Ramda'