Заглавный регистр Lodash (первая буква каждого слова заглавная)

109

Я просматриваю документы lodash и другие вопросы о переполнении стека - хотя есть несколько собственных способов выполнения этой задачи JavaScript , есть ли способ преобразовать строку в регистр заголовка, используя чисто функции lodash (или, по крайней мере, существующие прототипные функции) чтобы мне не пришлось использовать регулярное выражение или определять новую функцию?

например

This string ShouLD be ALL in title CASe

должен стать

This String Should Be All In Title Case
брендонскрипт
источник
3
вы можете сделать то же самое и из HTML, style = "text-transform: capitalize"
Чаудхари

Ответы:

216

Это можно сделать с помощью небольшой модификации startCase:

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

4касл
источник
3
_.startCase("aaa BBB ccc") === "Aaa BBB Ccc"
Brandon
2
Мне это нравится. Я не знал об этом startCase.
Брэндон
1
.startCase ( "camelString") === "Camel String" , но _.startCase ( .toLower ( "camelString")) === "Camelstring" Похоже , lodash нужен метод titleCase
aristidesfl
4
Мне это нравится, однако он удаляет такие символы, как :, это проблема.
JabberwockyDecompiler
1
Он не работает для имен с акцентом (испанское «Martínez Cortés Peña» становится «Martinez Cortes Pena») или с дефисами (французское «Жан-Луи» становится «Жан Луи»). То же самое касается любых "* Case" функций lodash
Flo
43
_.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'
Aristidesfl
источник
27

с lodash версии 4.

_.upperFirst(_.toLower(str))

Джеймс Нгуен
источник
3
Этот лучше, чем startCaseпотому, что он может обрабатывать больше букв, чем az, например å, ä и ö.
Lars Nyström
3
upperFirst изменит только первый символ первого слова, а не для последующих слов. Я не считаю, что это лучше, чем startCase именно по этой причине.
Raghavan
15
'This string ShouLD be ALL in title CASe'
  .split(' ')
  .map(_.capitalize)
  .join(' ');
CD..
источник
1
Однозначно самый лаконичный, нравится. Очевидно, все еще требуется разбиение на массив, но это все еще самое короткое и приятное решение из того, что я могу сказать. Кроме того, согласно проблеме 1528, которую указал @AlexandreThebaldi, вероятно, следует использовать upperFirstвместо capitalize.
brandonscript
... но _.startCase определенно выигрывает :)
brandonscript
5
_.startCaseубирает пунктуацию. Пример _.startCase('first second etc...возвращает строкуFirst Second Etc
LuckyStarr
Это было лучше для моего случая использования в качестве startCaseПреобразует все к заготовке, например , user_nameбудет User Name, и я хотел только User_nameкак text-transform: capitalizeсвойство CSS
gonzarodriguezt
7

На этот вопрос есть неоднозначные ответы. Некоторые рекомендуют использовать, _.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

Вишал Шетти
источник
Ага, а как насчет строк со смешанным регистром? Ни один из них не превратит «jOn DoE» в «Jon Doe» без него _.lower().
brandonscript
3

Вот способ использования ТОЛЬКО методов lodash и без встроенных методов:

_.reduce(_.map(_.split("Hello everyOne IN the WOrld", " "), _.capitalize), (a, b) => a + " " + b)
Брэндон
источник
1
const titleCase = str =>
  str
    .split(' ')
    .map(str => {
      const word = str.toLowerCase()
      return word.charAt(0).toUpperCase() + word.slice(1)
    })
    .join(' ')

Вы также можете разделить функцию карты на отдельные слова

Люк Робертсон
источник
0
 var s = 'This string ShouLD be ALL in title CASe';
 _.map(s.split(' '), (w) => _.capitalize(w.toLowerCase())).join(' ')

Если я не пропустил, lodash не имеет собственных методов нижнего / верхнего регистра.

agmcleod
источник
@vbotio похоже _.upperFirstотносится только к первому символу (синоним _.capitalize()?)
brandonscript
1
capitalizeи upperFirstделать разные вещи.
Brandon
_.capitalize применяется ко всей строке
vbotio
0

Не такой краткий, как ответ @ 4castle, но, тем не менее, описательный и полный lodash ...

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>

Марселино
источник
Я предполагаю, что многословность и длина ответа делают его почти нежелательным. Я не голосовал против, но это был бы не мой первый выбор.
brandonscript
0

Вот еще одно решение для моего варианта использования: "позвоночник дьявола"

Просто:

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

Использование startCase удалит апостроф, поэтому мне пришлось обойти это ограничение. Остальные решения казались довольно запутанными. Мне он нравится, потому что он чистый, понятный.

Альбертпейро
источник
0

Это можно сделать только с помощью 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.
Джастин Браун
Да, но вы не вызываете функции из lodash; если вы как-то не var words = ._words
назвали
0

Код ниже будет работать отлично:

var str = "TITLECASE";
_.startCase(str.toLowerCase());
Тарун Маджумдер
источник
-3

с lodash 4 вы можете использовать _.capitalize ()

_.capitalize('JOHN') Возвращает "Джон"

См https://lodash.com/docs/4.17.5#capitalize подробности

LI Zhuoran
источник
Было бы хорошо протестировать вариант использования для предложения слов. Подозреваю, что это не все первые буквы каждого слова с большой буквы.
brandonscript
Действительно, «предложение» выводит «предложение»
Андрес Сапата