599 Stimmen

Wie kann ich jeden Buchstaben eines Textes mit Javascript verarbeiten?

Ich möchte jeden Buchstaben einer Zeichenkette melden, weiß aber nicht, wie ich das anstellen soll.

Also, wenn ich es habe:

var str = 'This is my string';

Ich möchte die Möglichkeit haben, getrennt zu alarmieren T , h , i , s , usw. Dies ist nur der Anfang einer Idee, an der ich arbeite, aber ich muss wissen, wie ich jeden Buchstaben einzeln bearbeiten kann.

Ich dachte, ich müsste die Split-Funktion verwenden, nachdem ich getestet habe, wie lang die Zeichenfolge ist.

Wie kann ich das tun?

10 Stimmen

Vielleicht haben Sie danach gesucht: Seit ES6 gibt es for(const c of str) { ... } . Mehr dazu weiter unten in einer recht ausführlichen, aber nicht ausreichend hochgestimmten Antwort. PS: Der Link von @ARJUN funktioniert bei mir nicht.

644voto

Eli Grey Punkte 34008

Wenn die Reihenfolge der Ausschreibungen wichtig ist, verwenden Sie diese:

for (var i = 0; i < str.length; i++) {
  alert(str.charAt(i));
}

Oder so: ( siehe auch diese Antwort )

 for (var i = 0; i < str.length; i++) {
   alert(str[i]);
 }

Wenn die Reihenfolge der Ausschreibungen keine Rolle spielt, verwenden Sie dies:

var i = str.length;
while (i--) {
  alert(str.charAt(i));
}

Oder so: ( siehe auch diese Antwort )

 var i = str.length;
while (i--) {
  alert(str[i]);
}

var str = 'This is my string';

function matters() {
  for (var i = 0; i < str.length; i++) {
    alert(str.charAt(i));
  }
}

function dontmatter() {
  var i = str.length;
  while (i--) {
    alert(str.charAt(i));
  }
}

<p>If the order of alerts matters, use <a href="#" onclick="matters()">this</a>.</p>

<p>If the order of alerts doesn't matter, use <a href="#" onclick="dontmatter()">this</a>.</p>

4 Stimmen

Unter Verwendung der [] um das Zeichen an einer bestimmten Position zu erhalten, wird im IE < 9 nicht unterstützt.

20 Stimmen

Wie in der anderen Antwort beschrieben, können Sie str.charAt(i) anstelle der [] verwenden. Warum Sie charAt im Gegensatz zu [] verwenden sollten, erfahren Sie unter string.charAt(x) oder string[x]

19 Stimmen

Ich finde es schwer zu glauben, dass ein moderner JS-Compiler die Länge neu berechnen würde, wenn die Zeichenfolge nicht innerhalb der Schleife geändert wurde. In jeder anderen Sprache würde ich die Längenüberprüfung gerne in der Testklausel der for-Schleife durchführen, in der Annahme, dass der Compiler es am besten weiß und entsprechend optimieren würde.

469voto

Mr. Goferito Punkte 5283

Es ist wahrscheinlich mehr als gelöst. Ich möchte nur mit einer anderen einfachen Lösung beitragen:

var text = 'uololooo';

// With ES6
[...text].forEach(c => console.log(c))

// With the `of` operator
for (const c of text) {
    console.log(c)
}

// With ES5
for (var x = 0, c=''; c = text.charAt(x); x++) { 
    console.log(c); 
}

// ES5 without the for loop:
text.split('').forEach(function(c) {
    console.log(c);
});

7 Stimmen

Das letzte Beispiel kann einfach sein [...text].forEach(console.log)

23 Stimmen

Nein, das kann sie nicht. forEach() übergibt den Index und das Array als zweites und drittes Argument. Ich würde lieber nicht protokollieren, dass

3 Stimmen

Beachten Sie, dass sowohl der Spread-Operator (erstes Beispiel) als auch der Split-Aufruf (letztes Beispiel) ein neues Array erzeugen. Dies ist in der Regel kein Problem, kann aber bei großen Zeichenketten oder häufiger Verwendung kostspielig sein.

123voto

zurfyx Punkte 27060

Wie man jeden Buchstaben eines Textes verarbeitet (mit Benchmarks)

https://jsperf.com/str-for-in-of-foreach-map-2

für

Klassisch und bei weitem derjenige mit den meisten meiste Leistung . Sie sollten sich für diesen Algorithmus entscheiden, wenn Sie ihn in einem leistungskritischen Algorithmus verwenden wollen oder wenn er maximale Kompatibilität mit den Browser-Versionen erfordert.

for (var i = 0; i < str.length; i++) {
  console.info(str[i]);
}

für...von

für...von ist die neue ES6 für Iterator. Wird von den meisten modernen Browsern unterstützt. Es ist visuell ansprechender und weniger anfällig für Tippfehler. Wenn Sie sich in einer Produktionsanwendung für diese Variante entscheiden, sollten Sie wahrscheinlich einen Transpiler wie Babel .

let result = '';
for (let letter of str) {
  result += letter;
}

forEach

Funktionell Ansatz. Airbnb genehmigt . Der größte Nachteil bei dieser Vorgehensweise ist die split() die ein neues Array erstellt, um jeden einzelnen Buchstaben der Zeichenkette zu speichern.

Warum? Damit wird unsere unumstößliche Regel durchgesetzt. Der Umgang mit reinen Funktionen die Werte zurückgeben, ist einfacher zu verstehen als bei Seiteneffekten.

// ES6 version.
let result = '';
str.split('').forEach(letter => {
  result += letter;
});

o

var result = '';
str.split('').forEach(function(letter) {
  result += letter;
});

Die folgenden sind die, die ich nicht mag.

für...in

Im Gegensatz zu for...of erhalten Sie den Buchstabenindex anstelle des Buchstabens. Das funktioniert ziemlich schlecht.

var result = '';
for (var letterIndex in str) {
  result += str[letterIndex];
}

Karte

Funktionsansatz, was gut ist. Allerdings ist map nicht dafür gedacht, dafür verwendet zu werden. Es sollte verwendet werden, wenn die Werte innerhalb eines Arrays geändert werden müssen, was nicht der Fall ist.

// ES6 version.
var result = '';
str.split('').map(letter => {
  result += letter;
});

o

let result = '';
str.split('').map(function(letter) {
  result += letter;
});

1 Stimmen

Auf meinem Rechner wird die klassische for Schleife war tatsächlich die zweitlangsamste, während for...of war am schnellsten (etwa dreimal so schnell wie for ).

10 Stimmen

Wo ist die Benchmark? Was ist die schnellste Lösung?

0 Stimmen

@JohnMontgomery Ihre Ergebnisse scheinen der Behauptung von zurfyx zu widersprechen, dass die klassische Schleife am schnellsten ist.

77voto

miku Punkte 170688

Eine mögliche Lösung in reinem Javascript:

for (var x = 0; x < str.length; x++)
{
    var c = str.charAt(x);
    alert(c);
}

0 Stimmen

Es wäre wahrscheinlich besser mit var x = 0 und var c = str.charAt(x).

3 Stimmen

Außerdem sollte str.length in einer Variablen gespeichert werden, damit nicht ständig auf sie zugegriffen werden muss.

8 Stimmen

@EliGrey Ist es wirklich so wichtig, die Länge in eine Variable einzugeben? Haben Sie Benchmarks, wann dies gegenüber weniger Codezeilen vorzuziehen ist?

63voto

hippietrail Punkte 14583

Die meisten, wenn nicht sogar alle Antworten hier sind falsch, weil sie immer dann abbrechen, wenn ein Zeichen in der Zeichenkette vorkommt außerhalb der Unicode BMP (Basic Multilingual Plane) . Das bedeutet alle Emoji werden kaputt sein .

JavaScript verwendet UTF- 16 Unicode für alle Zeichenfolgen. In UTF-16 bestehen die Zeichen jenseits des BMP aus zwei Teilen, die als " Leihmutter Paar "und die meisten Antworten hier werden jeden Teil eines solchen Paares einzeln und nicht als einzelnes Zeichen verarbeiten.

Eine Möglichkeit in modernem JavaScript seit mindestens 2016 ist die Verwendung des neuen String-Iterator . Hier ist das Beispiel (fast) direkt aus dem MDN:

var string = 'A\uD835\uDC68B\uD835\uDC69C\uD835\uDC6A';

for (var v of string) {
  alert(v);
}
// "A"
// "\uD835\uDC68"
// "B"
// "\uD835\uDC69"
// "C"
// "\uD835\uDC6A"

5 Stimmen

Eine moderne Lösung für die Aufteilung einer Zeichenkette in Zeichen unter Berücksichtigung von Surrogatpaaren finden Sie unter: stackoverflow.com/a/42596897/527702

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