我正在使用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吗?
答案 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
只是&符号是安全)。
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"
只是详细说明我在这里所做的事情: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
来大写第一个字符,然后使用正则表达式替换所有其他首字母:
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;
答案 3 :(得分:0)
Lodash还有另一种方法toLower,它将字符串作为一个整体而不是像lowerCase这样的空格分隔的单词。