Справа заголовка Лодаша (велика перша літера кожного слова)


108

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

напр

This string ShouLD be ALL in title CASe

повинні стати

This String Should Be All In Title Case


3
ви можете зробити те ж саме з HTML, style = "text-transform: capitalize"
Chaudhary

Відповіді:


214

Це можна зробити за допомогою невеликої модифікації startCase:

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


3
_.startCase("aaa BBB ccc") === "Aaa BBB Ccc"
Брендон

2
Мені це подобається. Я про це не знав startCase.
Брендон

1
.startCase ("camelString") === "Струна верблюда", але _.startCase ( .toLower ("camelString")) === "Camelstring" здається, що lodash потребує методу
titleCase

4
Мені це подобається, проте він видаляє такі символи, як :, це проблема.
JabberwockyDecompiler

1
Це не працює для імен з наголосом (іспанська "Martínez Cortés Peña" стає "Martinez Cortes Pena") або з дефісами (французька "Jean-Louis" стає "Jean Louis"). Те саме стосується будь-яких функцій "* Case" лодашу
Flo

42
_.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'

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(' ');

1
Однозначно найкоротший, як це. Очевидно, все ще потрібно розбиття на масив, але це все-таки найкоротше і найсолодше рішення з того, що я можу сказати. Крім того, згідно випуску 1528, який вказав @AlexandreThebaldi, можливо, слід використовувати upperFirstзамість capitalize.
фірмовий сценарій

... але _.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().
фірмовий сценарій

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 не має власних методів нижнього / верхнього регістру.


@vbotio виглядає так, що _.upperFirstстосується лише першого символу (синонім _.capitalize()?)
брендоскрипт

1
capitalizeі upperFirstробити різні речі.
Брендон

_.capitalize застосовується до всього рядка
vbotio

0

Не настільки стислий, як відповідь @ 4castle, але описовий та повний, але все-таки ...

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>


Я б здогадався, що багатослівність та тривалість відповіді роблять це майже небажаним. Я не став голосом, але це був би не мій перший вибір.
фірмовий сценарій

0

Ось ще одне рішення для мого випадку використання: "чортовий хребет"

Просто:

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

Використання startCase призведе до видалення апострофа, тому мені довелося обійти це обмеження. Інші рішення видалися досить заплутаними. Мені це подобається, як це чисто, легко зрозуміти.


0

Це можна зробити лише лодашем

properCase = string =>
        words(string)
            .map(capitalize)
            .join(' ');

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

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

Вам потрібно вимагати великих літер і слів від лодашу.
Джастін Браун


Так, але ви не викликаєте функції з lodash; якщо ви не псевдонімами їх яким - то чиномvar words = ._words
brandonscript


-3

з lodash 4, ви можете використовувати _.capitalize ()

_.capitalize('JOHN') Повертається "Джон"

Див https://lodash.com/docs/4.17.5#capitalize подробиці


Було б добре перевірити випадок використання для речення слів. Підозрюйте, що це не з великої літери всіх перших літер кожного слова.
фірмовий сценарій

Дійсно, "речення" виводить "речення"
Андрес Сапата,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.