774 Stimmen

Zeichenkette mit JavaScript in Großbuchstaben umwandeln

Gibt es eine einfache Möglichkeit, eine Zeichenfolge in Title Case zu konvertieren? z.B.. john smith wird John Smith . Ich bin nicht auf der Suche nach etwas Kompliziertem wie Die Lösung von John Resig nur (hoffentlich) eine Art Ein- oder Zweizeiler.

1 Stimmen

Es gibt verschiedene Methoden, haben wir einige Leistungsstatistiken?

1 Stimmen

2 Stimmen

Wir schreiben das Jahr 2022, und die Browser verfügen immer noch nicht über eine native Funktion für diese Aufgabe.

11voto

waqas Punkte 4107

Wenn Sie Bibliotheken von Drittanbietern in Ihrem Code verwenden können, dann hat lodash eine Hilfsfunktion für uns.

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

_.startCase('foo bar');
// => 'Foo Bar'

_.startCase('--foo-bar--');
// => 'Foo Bar'

_.startCase('fooBar');
// => 'Foo Bar'

_.startCase('__FOO_BAR__');
// => 'FOO BAR'

11voto

Geoman Yabes Punkte 2119

Konvertieren Sie zunächst Ihre string in Array durch Spaltung es durch Leerzeichen:

var words = str.split(' ');

Dann verwenden Sie array.map um ein neues Array zu erstellen, das die großgeschriebenen Wörter enthält.

var capitalized = words.map(function(word) {
    return word.charAt(0).toUpperCase() + word.substring(1, word.length);
});

Entonces beitreten das neue Feld mit Leerzeichen:

capitalized.join(" ");

function titleCase(str) {
  str = str.toLowerCase(); //ensure the HeLlo will become Hello at the end
  var words = str.split(" ");

  var capitalized = words.map(function(word) {
    return word.charAt(0).toUpperCase() + word.substring(1, word.length);
  });
  return capitalized.join(" ");
}

console.log(titleCase("I'm a little tea pot"));

HINWEIS:

Das hat natürlich einen Nachteil. Es wird nur der erste Buchstabe eines jeden Wortes großgeschrieben. Mit Wort ist gemeint, dass jede durch Leerzeichen getrennte Zeichenkette als ein Wort behandelt wird.

Vermutlich haben Sie das:

str = "I'm a little/small tea pot";

Dies führt zu

Ich bin ein wenig klein Teekanne

im Vergleich zu den erwarteten

Ich bin ein kleiner/kleiner Teepott

In diesem Fall können Sie mit Regex und .ersetzen reicht aus:

mit ES6:

const capitalize = str => str.length
  ? str[0].toUpperCase() +
    str.slice(1).toLowerCase()
  : '';

const escape = str => str.replace(/./g, c => `\\${c}`);
const titleCase = (sentence, seps = ' _-/') => {
  let wordPattern = new RegExp(`[^${escape(seps)}]+`, 'g');

  return sentence.replace(wordPattern, capitalize);
};
console.log( titleCase("I'm a little/small tea pot.") );

oder ohne ES6 :

function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.substring(1, str.length).toLowerCase();
}

function titleCase(str) {
  return str.replace(/[^\ \/\-\_]+/g, capitalize);
}

console.log(titleCase("I'm a little/small tea pot."));

10voto

jssridhar Punkte 460

ES 6

str.split(' ')
   .map(s => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())
   .join(' ')

sonst

str.split(' ').map(function (s) {
    return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();
}).join(' ')

0 Stimmen

Nur eine Vorwarnung, sollte wahrscheinlich sein s.slice(0, 1).toUpperCase() wenn Sie den ersten Buchstaben noch haben wollen.

0 Stimmen

@jssridhar Sie sollten auch den Code in ES6 korrigieren.

1 Stimmen

Bricht, wenn str ist ein einzelnes Zeichen

9voto

lewax00 Punkte 178

Die meisten dieser Antworten scheinen die Möglichkeit zu ignorieren, das Wortgrenzen-Metacharakter ( \b ). Eine kürzere Version der Antwort von Greg Dean, die sie nutzt:

function toTitleCase(str)
{
    return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); });
}

Das funktioniert auch bei Namen mit Bindestrich wie Jim-Bob.

2 Stimmen

Ist eine elegante Teillösung, funktioniert aber nicht bei Zeichenketten mit Akzent oder Großbuchstaben. Ich erhalte "Sofía Vergara" => "SofíA Vergara" oder "Sofía VERGARA" => "SofíA VERGARA". Der zweite Fall könnte mit der Anwendung der Funktion .toLowerCase() vor .replace(...) gelöst werden. Für den ersten Fall muss ein passender regulärer Ausdruck gefunden werden.

2 Stimmen

Hmm, das scheint wie ein Fehler in der Regex-Implementierung, ich würde denken, dass akzentuierte Zeichen Wortzeichen sein sollten (Sie haben jedoch Recht, wie-ist es nicht für diese Fälle funktioniert).

0 Stimmen

\w enthält nur die Zeichen [A-Za-z0-9_] , nicht alle Buchstaben. Dafür müssten Sie die Unicode-Kategorie verwenden \p{L} . Sie benötigen die /u Modifikator (siehe aquí ) und eine andere Lösung für \b die nur zwischen \W y \w (siehe aquí )

8voto

Vikram Punkte 554

Versuchen Sie dies, der kürzeste Weg:

str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());

0 Stimmen

Das ist süß. Für den grundlegenden Anwendungsfall habe ich (wo Leistung ist nicht unbedingt eine Priorität) dies funktioniert perfekt!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X