【问题标题】:Lodash title case (uppercase first letter of every word)Lodash 标题大小写(每个单词的首字母大写)
【发布时间】:2016-10-31 06:20:27
【问题描述】:

我正在查看 lodash 文档和其他 Stack Overflow 问题 - 虽然有 are several native JavaScript ways of accomplishing this task,但有没有办法可以使用 purely lodash 函数(或至少现有的原型函数),这样我就不必使用正则表达式或定义新函数?

例如

This string ShouLD be ALL in title CASe

应该变成

This String Should Be All In Title Case

【问题讨论】:

标签: javascript lodash


【解决方案1】:

这可以通过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>

【讨论】:

  • _.startCase("aaa BBB ccc") === "Aaa BBB Ccc"
  • 我喜欢。我不知道startCase
  • .startCase("camelString") === "Camel String" 但 _.startCase(.toLower("camelString")) === "Camelstring" 看起来像lodash 需要一个 titleCase 方法
  • 我喜欢这个,但是,它会删除诸如:之类的字符,这是一个问题。
  • 它不适用于带重音的名字(西班牙语“Martínez Cortés Peña”变成“Martinez Cortes Pena”)或连字符(法语“Jean-Louis”变成“Jean Louis”)。 lodash 的任何“*Case”函数也是如此
【解决方案2】:
_.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'

【讨论】:

  • 相当于_.startCase(_.lowerCase(string))
【解决方案3】:

使用 lodash 版本 4。

_.upperFirst(_.toLower(str))

【讨论】:

  • 这个比startCase好,因为它可以处理比a-z更多的字母,例如å、ä和ö。
  • upperFirst 只会更改第一个单词的第一个字符,不会更改后续单词。由于这个特殊原因,我不认为这比 startCase 更好。
【解决方案4】:
'This string ShouLD be ALL in title CASe'
  .split(' ')
  .map(_.capitalize)
  .join(' ');

【讨论】:

  • 绝对是最简洁的,喜欢。显然仍然需要拆分成一个数组,但这仍然是我能说的最短和最甜蜜的解决方案。此外,根据@AlexandreThebaldi 指出的问题 1528,可能应该使用 upperFirst 而不是 capitalize
  • ... 但是 _.startCase 肯定会赢 :)
  • _.startCase 删除标点符号。示例_.startCase('first second etc... 返回字符串First Second Etc
  • 这对我的用例更好,因为startCase 将所有内容都转换为空白,例如user_name 将是User Name,我只想要User_name,就像CSS 的text-transform: capitalize 属性
【解决方案5】:

这个问题有不同的答案。 有的推荐使用_.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”。
【解决方案6】:

这是我在自己的用例中测试的最简洁、最灵活的实现。

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("-") => "-"

【讨论】:

    【解决方案7】:

    这是一种只使用 lodash 方法而不使用内置方法的方法:

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

    【讨论】:

      【解决方案8】:
      const titleCase = str =>
        str
          .split(' ')
          .map(str => {
            const word = str.toLowerCase()
            return word.charAt(0).toUpperCase() + word.slice(1)
          })
          .join(' ')
      

      你也可以拆分出map函数来做单独的单词

      【讨论】:

        【解决方案9】:

        这可以只用 lodash 完成

        properCase = string =>
                words(string)
                    .map(capitalize)
                    .join(' ');
        
        const proper = properCase('make this sentence propercase');
        
        console.log(proper);
        //would return 'Make This Sentence Propercase'
        

        【讨论】:

        【解决方案10】:

        来自https://github.com/lodash/lodash/issues/3383#issuecomment-430586750

        'JHON&JOHN C/O DR. BLah'.replace(/\w+/g, _.capitalize);
        

        结果:

        'Jhon&John C/O Dr. Blah'
        

        【讨论】:

          【解决方案11】:
           var s = 'This string ShouLD be ALL in title CASe';
           _.map(s.split(' '), (w) => _.capitalize(w.toLowerCase())).join(' ')
          

          除非我错过了,否则 lodash 没有自己的小写/大写方法。

          【讨论】:

          • @vbotio 看起来 _.upperFirst 仅适用于第一个字符(_.capitalize() 的同义词?)
          • capitalizeupperFirst 做不同的事情。
          • _.capitalize 应用于整个字符串
          【解决方案12】:

          不像@4castle 的回答那样简洁,但描述性和lodash-full,尽管如此......

          var basicTitleCase = _
              .chain('This string ShouLD be ALL in title CASe')
              .toLower()
              .words()
              .map(_.capitalize)
              .join(' ')
              .value()
          
          console.log('Result:', basicTitleCase)
          console.log('Exact Match:' , basicTitleCase === '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>

          【讨论】:

          • 我猜答案的冗长和冗长使它几乎不受欢迎。我没有投反对票,但这不是我的第一选择。
          【解决方案13】:

          这是我的用例的另一个解决方案: “魔鬼的脊梁”

          简单地说:

          function titleCase (str) {
            return _.map(str.split(' '), _.upperFirst).join(' ');
          }
          

          使用 startCase 会删除撇号,所以我必须解决这个限制。其他解决方案似乎相当复杂。我喜欢它,因为它干净、易于理解。

          【讨论】:

          • 然而,这不能为一个全大写字母的字符串命名。
          【解决方案14】:

          以下代码将完美运行:

          var str = "TITLECASE";
          _.startCase(str.toLowerCase());
          

          【讨论】:

            【解决方案15】:

            使用 lodash 4,您可以使用 _.capitalize()

            _.capitalize('JOHN') 它返回“约翰”

            详情请见https://lodash.com/docs/4.17.5#capitalize

            【讨论】:

            • 最好测试一个单词的用例。怀疑这不会将每个单词的所有首字母大写。
            • 确实,'the sentence' 输出'The sentence'
            猜你喜欢
            • 2015-12-10
            • 2020-08-30
            • 2016-12-05
            • 2015-11-10
            • 2016-12-23
            • 2015-11-04
            • 2017-08-02
            • 2012-11-11
            • 1970-01-01
            相关资源
            最近更新 更多