Lodash标题大小写(每个单词的首字母大写)

180
我正在查阅lodash文档和其他Stack Overflow问题,虽然有几种原生的JavaScript可以完成此任务的方法,但是否有一种方式可以使用纯粹的lodash函数(或至少现有的原型函数)将字符串转换为标题大小写,这样我就不必使用正则表达式或定义一个新函数吗?
例如:
This string ShouLD be ALL in title CASe

应变为

This String Should Be All In Title Case

2
https://github.com/lodash/lodash/issues/1528 - Alexandre Thebaldi
11
你也可以通过HTML来实现同样的效果,方法是在标签中添加属性**style="text-transform: capitalize"**。 - Apurv Chaudhary
这个在 lodash 中不存在的原因是因为不同的使用情况期望从中获得不同的结果。当对法语名称(例如:jean-pierre)进行 titleCase 处理时,期望的结果是 Jean-Pierre。但是当对 npm 包名称进行 titleCase 处理时,期望的结果是 Some Package Name,而不是 some-package-name - tao
1
由于lodash由于特殊字符问题没有提供一个好的解决方案,因此这里有另一个可用的包:titleCase(str.toLowerCase()),来自https://www.npmjs.com/package/title-case。它可以正确处理特殊字符和`-`和`'`后的大写字母。 - maganap
16个回答

323

通过对 startCase 的小改动即可实现此功能:

_.startCase(_.toLower(str));

console.log(_.startCase(_.toLower("This string ShouLD be ALL in title CASe")));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>


4
_.startCase("aaa BBB ccc") === "Aaa BBB Ccc" - Brandon
2
我喜欢它。我不知道startCase是什么。 - Brandon
3
_.startCase("camelString") === "Camel String" 但是 .startCase(.toLower("camelString")) === "Camelstring"看起来 Lodash 需要一个 titleCase 方法。 - aristidesfl
9
我喜欢这个,不过它会去掉像是 : 这样的字符,这是个问题。 - JabberwockyDecompiler
4
无法处理带重音的名字(例如西班牙语中的“Martínez Cortés Peña”会变成“Martinez Cortes Pena”)或带连字符的名字(例如法语中的“Jean-Louis”会变成“Jean Louis”)。同样,lodash的任何“*Case”函数也是如此。 - Flo
显示剩余10条评论

76
_.startCase(_.camelCase(str))

对于非用户生成的文本,此方法处理的情况比已被接受的答案更多。

> startCase(camelCase('myString'))
'My String'
> startCase(camelCase('my_string'))
'My String'
> startCase(camelCase('MY_STRING'))
'My String'
> startCase(camelCase('my string'))
'My String'
> startCase(camelCase('My string'))
'My String'

1
等同于 _.startCase(_.lowerCase(string)) - Ivan Yulin
camelCasestartCase 踩扁了,它不再是一头骆驼了。 - MrYellow

49
使用lodash版本4。 _.upperFirst(_.toLower(str)) 翻译为:将字符串转换为小写,再将首字母大写。

5
这个方法比 startCase 更好,因为它可以处理更多字母,例如 å、ä 和 ö,而不仅仅是 a-z。 - Lars Nyström
19
upperFirst仅会更改第一个单词的第一个字符,而不影响后续单词。我认为出于这个特定的原因,它并不比startCase更好。 - Raghavan
终于得到了正确的答案! - MrYellow

33
'This string ShouLD be ALL in title CASe'
  .split(' ')
  .map(_.capitalize)
  .join(' ');

2
绝对是最简洁的,我喜欢。显然仍需要拆分为数组,但从我所知道的来看,这仍然是最短和最甜美的解决方案。此外,根据@AlexandreThebaldi指出的1528问题,可能应该使用upperFirst而不是capitalize - brandonscript
但是 _.startCase 肯定赢了 :) - brandonscript
6
_.startCase会去除标点符号。例如,_.startCase('first second etc...')会返回字符串First Second Etc - LuckyStarr
1
这对我的使用情况更好,因为startCase会将所有内容转换为空白,例如user_name将变成User Name,而我只想要像CSS的text-transform: capitalize属性一样的User_name - gonzarodriguezt

18
这个问题的答案存在分歧。有些人建议使用_.upperFirst,而有些人则建议使用_.startCase
了解它们之间的区别。
i)_.upperFirst将转换您字符串的第一个字母,字符串可以是单词或多个单词,但只有您字符串的第一个字母会被转换为大写。 _.upperFirst('jon doe') 输出: Jon doe 查看文档https://lodash.com/docs/4.17.10#upperFirst ii)_.startCase将转换您字符串中每个单词的第一个字母。 _.startCase('jon doe') 输出: Jon Doe https://lodash.com/docs/4.17.10#startCase

是的,但是对于混合大小写的字符串呢?如果没有使用 _.lower(),这两种方法都不能将 'jOn DoE' 转换为 'Jon Doe'。 - brandonscript

7

在我的使用案例中,这是我认为最干净、最灵活的实现。

import { capitalize, map } from "lodash";

const titleCase = (str) => map(str.split(" "), capitalize).join(" ");

// titleCase("ALFRED NÚÑEZ") => "Alfred Núñez"
// titleCase("alfred núñez") => "Alfred Núñez"
// titleCase("AlFReD nÚñEZ") => "Alfred Núñez"
// titleCase("-") => "-"

5
以下代码将完美运行:
var str = "TITLECASE";
_.startCase(str.toLowerCase());

4

3

以下是仅使用lodash方法而没有内置方法的方法:

_.reduce(_.map(_.split("Hello everyOne IN the WOrld", " "), _.capitalize), (a, b) => a + " " + b)

2
这可以仅使用lodash完成。
properCase = string =>
        words(string)
            .map(capitalize)
            .join(' ');

const proper = properCase('make this sentence propercase');

console.log(proper);
//would return 'Make This Sentence Propercase'

你需要使用lodash中的capitalize和words方法。 - Justin Brown
https://lodash.com/docs/4.17.15#wordshttps://lodash.com/docs/4.17.15#capitalize - Justin Brown
是的,但你没有从lodash中调用函数;除非你以某种方式给它们取了别名 var words = ._words - brandonscript

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接