如何使用'&'等特殊字符格式化字符串在Lodash?

时间:2017-06-30 03:44:02

标签: javascript lodash

我正在使用Lodash将DIGITAL & TECHNOLOGY之类的字符串格式化为Digital & Technology。我尝试过以下代码:

_.startCase(_.lowerCase('DIGITAL & TECHNOLOGY'));

然而,这会让我Digital Technology

这也不起作用:

var words = _.words('DIGITAL & TECHNOLOGY', /[^ ]+/g);
var newWords = '';
_.forEach(words, function(w){
  newWords += _.capitalize(w);
})

返回Digital & technology

使用Lodash正确格式化这些字符串的适当方法是什么?或者我必须混合使用Lodash和Javascript吗?

4 个答案:

答案 0 :(得分:3)

用大写版本替换每个单词字符序列:

var str = 'DIGITAL & TECHNOLOGY';
var result = str.replace(/\w+/g, _.capitalize);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

答案 1 :(得分:1)

首先澄清一下,没有javascript就没有lodash这样的东西。

现在已经清除了,试试这个尺寸:

_.map(_.split('DIGITAL & TECHNOLOGY', /\s+/), _.capitalize).join(' ')

这会将任意数量的空格之间的单词分开,将每个空格映射为大写,然后将它们重新加入字符串中(您会注意到在上调用capitalize只是&符号是安全)。

编辑:我想通过将上述语句转换为仅使用lodash的函数来查看是否可以使其更加可重用。这就是我想出的:

const split = _.partialRight(_.split, /\s+/)
    , map   = _.partialRight(_.map, _.capitalize)
    , join  = _.partialRight(_.join, ' ');
const mycapitalize = _.flow([split, map, join]);

mycapitalize('DIGITAL & TECHNOLOGY');  // => "Digital & Technology"

我喜欢这种方法,因为它在语义上列出了处理字符串所采取的步骤(即首先将其拆分,然后映射它,然后加入它)。如果这是你的事情,它就像“一线”:

const mycapitalize = _.flow([
    _.partialRight(_.split, /\s+/)
  , _.partialRight(_.map, _.capitalize)
  , _.partialRight(_.join, ' ')
]);

mycapitalize('DIGITAL & TECHNOLOGY');  // => "Digital & Technology"

jsfiddle demo

只是详细说明我在这里所做的事情:partialRight有点像对bind的特殊调用。它部分地应用了函数(这基本上是一种方式来说它返回带有硬编码参数之一的函数)。通常,partial方法按顺序应用参数,因此partialRight以相反的顺序应用它们(即,如果函数有两个参数,partial将“硬编码”第一个{{1}将“硬编码”第二个/最后一个)。例如,partialRight接受两个参数,这些参数依次是要拆分的字符串和用于拆分的模式。 _.split提供了一个函数,它采用模式将_.partial(_.split, 'foo bar')分开,而"foo bar"则提供了一个函数,该函数将字符串拆分为_.partialRight(_.split, /\s+/)

我为任何多余的冗长而道歉。

此解决方案的另一部分是/\s+/ Flow 基本上是 compose 的用法(尽管 compose 的大部分实现都倾向于以相反的顺序应用函数;从右到左)。 _.flow获取一系列函数并返回一个函数,该函数按顺序应用该数组中的每个函数。例如,_.flow将为您提供一个函数,该函数将一个数字加一,然后将其乘以2并返回结果。

在此上下文中,_.flow([add1, mult2])接受我们使用flow创建的自定义操作,并将其应用于所获得的参数。在这种情况下,这意味着它会获得一个字符串,在partialRight上将其拆分,映射到/\s+/,然后按顺序加入_.capitalize

这可能会为您的目的而过度设计,但尽管如此,它仍然很有趣。

答案 2 :(得分:0)

您可以使用_.capitalize来大写第一个字符,然后使用正则表达式替换所有其他首字母:

&#13;
&#13;
var result = _.capitalize('DIGITAL & TECHNOLOGY').replace(/\s(\S)/g, function(v) { return v.toUpperCase(); });
console.log(result);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

Lodash还有另一种方法toLower,它将字符串作为一个整体而不是像lowerCase这样的空格分隔的单词。

https://lodash.com/docs/4.17.4#toLower