Lodash başlık durumu (her kelimenin ilk harfi büyük)


119

Lodash belgelerine ve diğer Stack Overflow sorularına bakıyorum - bu görevi yerine getirmenin birkaç yerel JavaScript yolu varken, tamamen lodash işlevlerini (veya en azından mevcut prototip işlevlerini) kullanarak bir dizeyi başlık durumuna dönüştürebilmemin bir yolu var mı? düzenli bir ifade kullanmam veya yeni bir işlev tanımlamam gerekmesin mi?

Örneğin

This string ShouLD be ALL in title CASe

olmalı

This String Should Be All In Title Case


4
aynı şeyi HTML'den de yapabilirsiniz, style = "text-transform: capitalize"
Chaudhary

Yanıtlar:


229

Bu, küçük bir değişiklik ile yapılabilir startCase:

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


3
_.startCase("aaa BBB ccc") === "Aaa BBB Ccc"
Brandon

2
Bunu sevdim. Bilmiyordum startCase.
Brandon

1
.startCase ("camelString") === "Camel String" ama _.startCase ( .toLower ("camelString")) === "Camelstring", lodash'ın bir titleCase yöntemine ihtiyacı var gibi görünüyor
aristidesfl

4
Bunu beğendim, ancak :sorun olan gibi karakterleri kaldırıyor .
JabberwockyDecompiler

1
Aksanlı ilk isimler (İspanyolca "Martínez Cortes Peña" "Martinez Cortes Pena" olur) veya kısa çizgilerle (Fransızca "Jean-Louis" "Jean Louis" olur) işe yaramaz. Lodash'ın tüm "* Durum" işlevleri için de aynı şey geçerli
Flo

45
_.startCase(_.camelCase(str))

Kullanıcı tarafından oluşturulmamış metin için bu, kabul edilen cevaptan daha fazla durumu ele alır

> 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'

31

lodash versiyonu ile 4.

_.upperFirst(_.toLower(str))


3
Bu, startCaseaz harfinden daha fazla harfi işleyebildiğinden daha iyidir, örneğin å, ä ve ö.
Lars Nyström

3
UpperFirst, sonraki sözcükleri değil, yalnızca ilk sözcüğün ilk karakterini değiştirir. Bu nedenle bunun startCase'den daha iyi olduğuna inanmıyorum.
Raghavan

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

2
Kesinlikle onun gibi en kısa olanı. Açıkçası hala bir diziye bölünmeyi gerektiriyor, ancak bu hala söyleyebileceğim en kısa ve en tatlı çözüm. Ayrıca, @AlexandreThebaldi'nin belirttiği 1528 sayıya göre, muhtemelen upperFirstyerine kullanmalıdır capitalize.
brandonscript

... ama _.startCase kesinlikle kazandı :)
brandonscript

5
_.startCasenoktalama işaretlerini kaldırır. Örnek _.startCase('first second etc...dizeyi döndürürFirst Second Etc
LuckyStarr

Bu benim kullanım örneği için daha iyiydi startCaseörneğin bir taslağa dönüştürür her şeyi user_nameolacak User Nameve ben sadece istediği User_namegibi text-transform: capitalizeCSS özelliği
gonzarodriguezt

7

Bu soruya karışık cevaplar var. Bazıları tavsiye _.upperFirstederken, bazıları tavsiye ediyor _.startCase.

Aralarındaki farkı bilin.

i) _.upperFirstdizenizin ilk harfini dönüştürecektir, ardından dizge tek bir sözcükten veya birden çok sözcükten oluşabilir, ancak dizenizin tek ilk harfi büyük harfe dönüştürülür.

_.upperFirst('jon doe')

çıktı:

Jon doe

belgeleri kontrol edin https://lodash.com/docs/4.17.10#upperFirst

ii) _.startCasedizenizdeki her kelimenin ilk harfini dönüştürecektir.

_.startCase('jon doe')

çıktı:

Jon Doe

https://lodash.com/docs/4.17.10#startCase


Evet, ama karışık durum dizeleri ne olacak? Bunların hiçbiri 'jOn DoE'yi' Jon Doe 'yapmaz _.lower().
brandonscript

3

İşte YALNIZCA lodash yöntemlerini kullanmanın ve yerleşik yöntemler içermeyen bir yol:

_.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(' ')

Ayrı kelimeler yapmak için harita işlevini de bölebilirsiniz


0
 var s = 'This string ShouLD be ALL in title CASe';
 _.map(s.split(' '), (w) => _.capitalize(w.toLowerCase())).join(' ')

Kaçırmadıysam, lodash'ın kendi küçük / büyük harf yöntemleri yok.


@vbotio _.upperFirstyalnızca ilk karakter için geçerli gibi görünüyor (eşanlamlısı _.capitalize()?)
brandonscript

1
capitalizeve upperFirstfarklı şeyler yapın.
Brandon

_.capitalize tüm dizeye uygulanır
vbotio

0

@ 4castle'ın cevabı kadar kısa değil, ama tanımlayıcı ve zindelik dolu, yine de ...

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>


Cevabın ayrıntı ve uzunluğunun onu neredeyse istenmeyen hale getirdiğini tahmin ediyorum. Olumsuz oy vermedim ama bu benim ilk tercihim olmazdı.
brandonscript

0

İşte benim kullanım durumum için başka bir çözüm: "şeytanın omurgası"

Basitçe:

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

StartCase kullanmak kesme işaretini kaldırır, bu yüzden bu sınırlamayı aşmak zorunda kaldım. Diğer çözümler oldukça karmaşık görünüyordu. Temiz ve anlaşılması kolay olduğu için bunu seviyorum.


0

Bu sadece lodash ile yapılabilir

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

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

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

Lodash'tan büyük harf ve kelimelere ihtiyacınız var.
Justin Brown


Evet, ancak işlevleri Lodash'tan aramıyorsunuz; onlara bir şekilde takma ad var words = ._words
vermediyseniz

0

Aşağıdaki kod mükemmel şekilde çalışacaktır:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.