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.

61voto

Tom Kay Punkte 1453

Ich ziehe die folgenden Antworten den anderen vor. Es wird nur der erste Buchstabe eines jeden Wortes gefunden und großgeschrieben. Einfacherer Code, leichter zu lesen und weniger Bytes. Vorhandene Großbuchstaben werden beibehalten, um zu verhindern, dass Akronyme entstellt werden. Sie können jedoch jederzeit toLowerCase() auf Ihrer Zeichenkette.

function title(str) {
  return str.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

Sie können dies zu Ihrem String-Prototyp hinzufügen, was es Ihnen ermöglicht 'my string'.toTitle() wie folgt:

String.prototype.toTitle = function() {
  return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

Beispiel:

String.prototype.toTitle = function() {
  return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

console.log('all lower case ->','all lower case'.toTitle());
console.log('ALL UPPER CASE ->','ALL UPPER CASE'.toTitle());
console.log("I'm a little teapot ->","I'm a little teapot".toTitle());

6 Stimmen

Noch schöner ist es als Lambda const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());

0 Stimmen

Ich wollte den IE nicht kaputt machen, aber ja, wenn die Anwendung nicht auf Legacy-Browser angewiesen ist, könnte es kürzer sein.

0 Stimmen

Dies ist nur eine Teillösung - op fragte, wie man eine Zeichenkette in Groß- und Kleinschreibung umwandelt. Diese Antwort erreicht das nicht für Eingaben wie NoT qUiITe .

56voto

KevBot Punkte 15948

Sie könnten sofort toLowerCase die Zeichenkette, und dann einfach toUpperCase der erste Buchstabe eines jeden Wortes. Wird zu einem sehr einfachen 1-Liner:

function titleCase(str) {
  return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
}

console.log(titleCase('iron man'));
console.log(titleCase('iNcrEdible hulK'));

0 Stimmen

Diese Lösung gefällt mir; schön und einfach. Es sieht aus wie ein bisschen CoffeeScript rutschte in Ihre Antwort aber ( s => s.toUpperCase() ). Meine Variante ist, das zu tun, was Sie getan haben, aber das String-Objekt zu erweitern (so umstritten das auch ist): Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})

1 Stimmen

@Waz, danke für die Ideen! Wollte nur zu klären, auf die => das ist ein native Pfeilfunktion (ES6), springt der Link zu den Mozillla Docs, die auch eine Tabelle zur Unterstützung enthalten.

0 Stimmen

Vielen Dank... ich suche etwas Kurzes und Präzises

39voto

Ulysse BN Punkte 8260

Benchmark

TL;DR

Der Gewinner dieses Benchmarks ist die einfache alte for-Schleife:

function titleize(str) {
    let upper = true
    let newStr = ""
    for (let i = 0, l = str.length; i < l; i++) {
        // Note that you can also check for all kinds of spaces  with
        // str[i].match(/\s/)
        if (str[i] == " ") {
            upper = true
            newStr += str[i]
            continue
        }
        newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase()
        upper = false
    }
    return newStr
}
// NOTE: you could beat that using charcode and string builder I guess.

Tatsächliche Benchmark

Ich habe die beliebtesten und eindeutigsten Antworten genommen und ein Benchmark mit denen.

Hier ist das Ergebnis auf meinem MacBook pro:

enter image description here

Der Vollständigkeit halber sind hier die verwendeten Funktionen aufgeführt:

str = "the QUICK BrOWn Fox jUMPS oVeR the LAzy doG";
function regex(str) {
  return str.replace(
    /\w\S*/g,
    function(txt) {
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }
  );
}

function split(str) {
  return str.
    split(' ').
    map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()).
    join(' ');
}

function complete(str) {
  var i, j, str, lowers, uppers;
  str = str.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });

  // Certain minor words should be left lowercase unless 
  // they are the first or last words in the string
  lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
  'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
  for (i = 0, j = lowers.length; i < j; i++)
    str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
      function(txt) {
        return txt.toLowerCase();
      });

  // Certain words such as initialisms or acronyms should be left uppercase
  uppers = ['Id', 'Tv'];
  for (i = 0, j = uppers.length; i < j; i++)
    str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
      uppers[i].toUpperCase());

  return str;
}

function firstLetterOnly(str) {
  return str.replace(/\b(\S)/g, function(t) { return t.toUpperCase(); });
}

function forLoop(str) {
  let upper = true;
  let newStr = "";
  for (let i = 0, l = str.length; i < l; i++) {
    if (str[i] == " ") {
      upper = true;
        newStr += " ";
      continue;
    }
    newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase();
    upper = false;
  }
  return newStr;
}

Ich habe den Prototyp absichtlich nicht geändert, da ich dies für eine sehr schlechte Praxis halte und ich denke, dass wir eine solche Praxis in unseren Antworten nicht fördern sollten. Dies ist nur für kleine Codebasen in Ordnung, wenn man der einzige ist, der daran arbeitet.

Wenn Sie einen anderen Weg zu diesem Benchmark hinzufügen möchten, kommentieren Sie bitte einen Link zu der Antwort!

1 Stimmen

Die Klammergruppe in der Methode "nur erster Buchstabe" wird nicht verbraucht, und wenn Sie sie entfernen, macht diese Methode die Regex-Methode zunichte, da sie sinnvoll ist.

1 Stimmen

Und str.toLowerCase().replace(/\b\S/g, function(t) { return t.toUpperCase(); }); gewinnt auch die 'regex'-Methode und erzielt das gleiche Ergebnis

0 Stimmen

Dramatische Verbesserung der complete Methode: jsben.ch/yTK3Y

26voto

simo Punkte 14048
var result =
  'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())

console.log(result) // This Is Very Interesting

0 Stimmen

Nur eine Frage: Die ()-Konstruktion dient dazu, eine Übereinstimmung mit einer beliebigen Option aus einer Reihe von Optionen anzugeben: (a|b) entspricht a oder b. Was bewirkt die Konstruktion (.)?

0 Stimmen

Für alle, die sich dieselbe Frage gestellt haben: Es wird ein Ersatz-"Blob" definiert, der im Ersatzabschnitt verwendet wird. Die Blobs sind fortlaufend nummeriert, der erste () wird in $1, der zweite in $2 eingefügt. Ich fand diese Seite nützlich: javascript.info/lehrgang/reguläre-ausdrücke-methoden

0 Stimmen

Ich bin nicht in der Lage, die oben zu bekommen, um zu arbeiten, aber ich bin weit von einem Regex-Assistenten. Ich bin mit 'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;}) Auch dies funktioniert nur für die Großschreibung des ersten Buchstabens einer Zeichenkette, aber für den Fall, dass Sie genau das brauchen, funktioniert meine Konstruktion.

24voto

kapil pandey Punkte 1658

Überrascht zu sehen, niemand erwähnt die Verwendung von Rest-Parameter. Hier ist ein einfacher Einzeiler, der ES6 Rest-Parameter verwendet.

let str="john smith"
str=str.split(" ").map(([firstChar,...rest])=>firstChar.toUpperCase()+rest.join("").toLowerCase()).join(" ")
console.log(str)

0 Stimmen

Ich schätze diese Lösung und habe beschlossen, dass dies der beste Code für meine beabsichtigte Verwendung ist. Ich habe festgestellt, dass es berücksichtigt die Verwendung eines Bindestrichs nicht in Namen. Dies hat jedoch keine großen Auswirkungen auf meine derzeitige Verwendung, Ich frage mich, wie dieser Code für diese Überlegung angepasst werden könnte . Nochmals vielen Dank für eine solide Lösung!

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