【发布时间】:2017-02-22 00:43:25
【问题描述】:
虽然写一个大写函数是微不足道的,例如:
"你好" => "你好" “你好” => “你好”
如何使用 Ramda JS 使用无点样式编写它?
【问题讨论】:
标签: javascript pointfree ramda.js
虽然写一个大写函数是微不足道的,例如:
"你好" => "你好" “你好” => “你好”
如何使用 Ramda JS 使用无点样式编写它?
【问题讨论】:
标签: javascript pointfree ramda.js
应该是这样的:
const capitalize = R.compose(
R.join(''),
R.juxt([R.compose(R.toUpper, R.head), R.tail])
);
Demo(在 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);
【讨论】:
ifElse(equals(null), identity, ,否则我认为Maybe monad 会派上用场。
isNil 而不是equals(null)!
ifElse + identity 组合可以替换为更具可读性的 unless 函数:const capitalizeIfNotNil = R.unless(R.isNil, capitalize);
我建议使用R.lens:
const char0 = R.lens(R.head, R.useWith(R.concat, [R.identity, R.tail]));
R.over(char0, R.toUpper, 'ramda');
// => 'Ramda'
【讨论】:
您可以使用在第一个字符上运行 toUpper 的正则表达式部分应用 replace:
const capitalize = R.replace(/^./, R.toUpper);
【讨论】:
replace 的第二个参数是字符串而不是函数。不适合我
R.replace。第二个参数也可以是一个函数,参见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
我为所有感兴趣的人整理了一些快速而肮脏的基准。看起来@lax4mike 是提供的答案中最快的(尽管更简单、非无点的str[0].toUpperCase() + str.slice(1) 更快[而且也不是 OP 所要求的,所以没有实际意义])。
https://jsfiddle.net/960q1e31/(您需要打开控制台并运行 fiddle 才能看到结果)
【讨论】:
对于任何寻求解决方案的人,该解决方案将首字母大写其余字母也小写,这里是:
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'
【讨论】: