Caso del titolo Lodash (prima lettera maiuscola di ogni parola)


108

Sto esaminando i documenti di lodash e altre domande su Stack Overflow: sebbene ci siano diversi modi JavaScript nativi per svolgere questa attività , esiste un modo in cui posso convertire una stringa in caso del titolo utilizzando funzioni puramente lodash (o almeno funzioni prototipali esistenti) in modo da non dover utilizzare un'espressione regolare o definire una nuova funzione?

per esempio

This string ShouLD be ALL in title CASe

dovrebbe diventare

This String Should Be All In Title Case


3
puoi fare la stessa cosa anche da HTML, style = "text-transform: capitalize"
Chaudhary

Risposte:


214

Questo può essere fatto con una piccola modifica di startCase:

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


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

2
Mi piace. Non lo sapevo startCase.
Brandon

1
.startCase ("camelString") === "Camel String" ma _.startCase (.toLower ( "camelString")) === "Camelstring" sembra che lodash abbia bisogno di un metodo titleCase
aristidesfl

4
Mi piace, tuttavia, rimuove caratteri come :, questo è un problema.
JabberwockyDecompiler

1
Non funziona per nomi con accento (lo spagnolo "Martínez Cortés Peña" diventa "Martinez Cortes Pena") o con trattini (il francese "Jean-Louis" diventa "Jean Louis"). Lo stesso vale per tutte le funzioni "* Case" del lodash
Flo

42
_.startCase(_.camelCase(str))

Per il testo non generato dall'utente, gestisce più casi rispetto alla risposta accettata

> 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

con la versione lodash 4.

_.upperFirst(_.toLower(str))


3
Questo è migliore del startCaseperché può gestire più lettere di az, ad esempio å, ä e ö.
Lars Nyström

3
upperFirst cambierà solo il primo carattere della prima parola, non per le parole successive. Non credo che questo sia meglio di startCase per questo motivo particolare.
Raghavan

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

1
Sicuramente il più conciso, piace. Ovviamente richiede ancora la suddivisione in un array, ma questa è ancora la soluzione più breve e dolce da quello che posso dire. Inoltre, per il numero 1528 indicato da @AlexandreThebaldi, probabilmente dovrebbe usare upperFirstinvece di capitalize.
brandonscript

... ma _.startCase vince sicuramente :)
brandonscript

5
_.startCaserimuove la punteggiatura. L'esempio _.startCase('first second etc...restituisce la stringaFirst Second Etc
LuckyStarr

Questo è stato il migliore per il mio caso d'uso come startCaseconvertiti tutto per un vuoto, ad esempio user_namesarà User Name, e volevo solo User_namecome iltext-transform: capitalize proprietà di CSS
gonzarodriguezt

7

Ci sono risposte contrastanti a questa domanda. Alcuni ne consigliano l'utilizzo _.upperFirstmentre altri lo consigliano _.startCase.

Conosci la differenza tra loro.

i) _.upperFirsttrasformerà la prima lettera della tua stringa, quindi la stringa potrebbe essere di una singola parola o più parole ma l'unica prima lettera della tua stringa viene trasformata in maiuscolo.

_.upperFirst('jon doe')

produzione:

Jon doe

controlla la documentazione https://lodash.com/docs/4.17.10#upperFirst

ii) _.startCasetrasformerà la prima lettera di ogni parola all'interno della tua stringa.

_.startCase('jon doe')

produzione:

Jon Doe

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


Sì, ma per quanto riguarda le stringhe miste? Nessuno di questi trasformerà "jOn DoE" in "Jon Doe" senza _.lower().
brandonscript

3

Ecco un modo utilizzando SOLO metodi lodash e nessun metodo integrato:

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

Puoi anche suddividere la funzione mappa per creare parole separate


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

A meno che non me lo sia perso, lodash non ha i propri metodi maiuscole / minuscole.


@vbotio sembra _.upperFirstsi applica solo al primo carattere (un sinonimo di _.capitalize()?)
brandonscript,

1
capitalizee upperFirstfare cose diverse.
Brandon

_.capitalize si applica all'intera stringa
vbotio

0

Non così conciso come la risposta di @ 4castle, ma descrittivo e pieno di lodash, comunque ...

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>


Immagino che la verbosità e la lunghezza della risposta la rendano quasi indesiderabile. Non ho downvote, ma non sarebbe stata la mia prima scelta.
brandonscript

0

Ecco un'altra soluzione per il mio caso d'uso: "spina dorsale del diavolo"

Semplicemente:

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

L'uso di startCase avrebbe rimosso l'apostrofo, quindi ho dovuto aggirare questa limitazione. Le altre soluzioni sembravano piuttosto contorte. Mi piace perché è pulito, facile da capire.


0

Questo può essere fatto solo con lodash

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

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

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

Devi richiedere lettere maiuscole e parole da lodash.
Justin Brown


Sì, ma non stai chiamando le funzioni da lodash; a meno che tu non li abbia in qualche modo aliasvar words = ._words
brandonscript

0

Il codice seguente funzionerà perfettamente:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.