Wie konvertiert man eine Zeichenfolge in ein Zeichenarray in JavaScript?
Ich denke, einen String wie "Hello world!"
das Array zu bekommen
['H','e','l','l','o',' ','w','o','r','l','d','!']
javascript
arrays
string
DarkLightA
quelle
quelle
"𨭎".split('')
führt zu["�", "�"]
."randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
nicht die Anzahl der Zeichen in der Zeichenfolge an, da einige Zeichen mehr Platz beanspruchen als andere.str.length
gibt Ihnen die Anzahl der 16-Bit-Zahlen an.Wie Hippietrail vorschlägt , kann die Antwort des Meders Ersatzpaare brechen und „Zeichen“ falsch interpretieren. Zum Beispiel:
Ich schlage vor, eine der folgenden ES2015-Funktionen zu verwenden, um diese Zeichenfolgen korrekt zu handhaben.
Spread-Syntax ( bereits von insertusernamehere beantwortet )
Array.from
RegExp-
u
FlagVerwenden Sie
/(?=[\s\S])/u
anstelle von "/(?=.)/u
weil".
nicht mit Zeilenumbrüchen übereinstimmt .Wenn Sie sich noch in der ES5.1-Ära befinden (oder wenn Ihr Browser diesen regulären Ausdruck nicht richtig verarbeitet - wie Edge), können Sie diese Alternative verwenden (von Babel transpiliert ):
Beachten Sie, dass Babel versucht, auch nicht übereinstimmende Surrogate korrekt zu behandeln. Dies scheint jedoch nicht für unübertroffene niedrige Surrogate zu funktionieren.
Testen Sie alles in Ihrem Browser:
Code-Snippet anzeigen
quelle
🏳️🌈
und die Kombination von diakritischen Zeichen von Zeichen aufteilt . Wenn Sie anstelle von Zeichen in Graphemcluster aufteilen möchten, lesen Sie stackoverflow.com/a/45238376 .Die
spread
SyntaxSie können die Spread-Syntax verwenden , einen Array-Initialisierer, der im ECMAScript 2015 (ES6) -Standard eingeführt wurde :
Beispiele
Die ersten drei ergeben:
Der letzte ergibt
Browser-Unterstützung
Überprüfen Sie die ECMAScript ES6-Kompatibilitätstabelle .
Weiterführende Literatur
spread
wird auch als "splat
" (z. B. in PHP oder Ruby oder als "scatter
" (z . B. in Python ) bezeichnet.Demo
Versuchen Sie es vor dem Kauf
quelle
Sie können auch verwenden
Array.from
.Diese Methode wurde in ES6 eingeführt.
Referenz
Array.from
quelle
Dies ist eine alte Frage, aber ich bin auf eine andere Lösung gestoßen, die noch nicht aufgeführt ist.
Mit der Object.assign-Funktion können Sie die gewünschte Ausgabe erhalten:
Nicht unbedingt richtig oder falsch, nur eine andere Option.
Object.assign wird am MDN-Standort gut beschrieben.
quelle
Array.from("Hello, world")
.[..."Hello, world"]
Es ist schon:
Oder verwenden Sie für eine ältere browserfreundliche Version:
quelle
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
.charAt()
obwohl ich lieber die Array-Variante verwenden würde. Verdammter IE.Es gibt (mindestens) drei verschiedene Dinge, die Sie sich als "Charakter" vorstellen können, und folglich drei verschiedene Kategorien von Ansätzen, die Sie möglicherweise verwenden möchten.
Aufteilung in UTF-16-Codeeinheiten
JavaScript-Zeichenfolgen wurden ursprünglich als Sequenzen von UTF-16-Codeeinheiten erfunden, zu einem Zeitpunkt in der Geschichte, als es eine Eins-zu-Eins-Beziehung zwischen UTF-16-Codeeinheiten und Unicode-Codepunkten gab. Die
.length
Eigenschaft eines Strings misst seine Länge in UTF-16-Codeeinheiten, und wenn Sie dies tun, erhaltensomeString[i]
Sie die i- te UTF-16-Codeeinheit vonsomeString
.Folglich können Sie ein Array von UTF-16-Codeeinheiten aus einer Zeichenfolge abrufen, indem Sie eine for-Schleife im C-Stil mit einer Indexvariablen verwenden ...
Es gibt auch verschiedene kurze Möglichkeiten, um dasselbe zu erreichen, z. B. die Verwendung
.split()
der leeren Zeichenfolge als Trennzeichen:Wenn Ihre Zeichenfolge jedoch Codepunkte enthält, die aus mehreren UTF-16-Codeeinheiten bestehen, werden diese in einzelne Codeeinheiten aufgeteilt, die möglicherweise nicht Ihren Wünschen entsprechen. Beispielsweise besteht die Zeichenfolge
'𝟘𝟙𝟚𝟛'
aus vier Unicode-Codepunkten (Codepunkte 0x1D7D8 bis 0x1D7DB), die in UTF-16 jeweils aus zwei UTF-16-Codeeinheiten bestehen. Wenn wir diese Zeichenfolge mit den oben beschriebenen Methoden aufteilen, erhalten wir ein Array mit acht Codeeinheiten:Aufteilen in Unicode-Codepunkte
Vielleicht möchten wir stattdessen unsere Zeichenfolge in Unicode-Codepunkte aufteilen! Dies ist möglich, seit ECMAScript 2015 der Sprache das Konzept einer Iterierbarkeit hinzugefügt hat . Strings sind jetzt iterabel, und wenn Sie sie durchlaufen (z. B. mit einer
for...of
Schleife), erhalten Sie Unicode-Codepunkte, keine UTF-16-Codeeinheiten:Wir können dies verkürzen, indem wir
Array.from
über das Iterable iterieren, das implizit übergeben wird:Unicode-Codepunkte sind jedoch nicht die größtmögliche Sache, die möglicherweise auch als "Zeichen" betrachtet werden könnte . Einige Beispiele für Dinge, die vernünftigerweise als ein einziges "Zeichen" betrachtet werden könnten, aber aus mehreren Codepunkten bestehen, sind:
Wir können unten sehen, dass, wenn wir versuchen, eine Zeichenfolge mit solchen Zeichen über den obigen Iterationsmechanismus in ein Array zu konvertieren, die Zeichen im resultierenden Array aufgelöst werden. (Falls eines der Zeichen in Ihrem System nicht gerendert wird,
yourString
besteht es unten aus einem Großbuchstaben A mit akutem Akzent, gefolgt von der Flagge des Vereinigten Königreichs, gefolgt von einer schwarzen Frau.)Wenn wir jedes dieser Elemente als einzelnes Element in unserem endgültigen Array behalten möchten, benötigen wir ein Array von Graphemen , keine Codepunkte.
Aufteilung in Grapheme
JavaScript hat keine integrierte Unterstützung dafür - zumindest noch nicht. Wir brauchen also eine Bibliothek, die die Unicode-Regeln versteht und implementiert, für welche Kombination von Codepunkten ein Graphem besteht. Zum Glück gibt es eines: Orlings Graphemspalter . Sie möchten es mit npm installieren oder, wenn Sie npm nicht verwenden, die Datei index.js herunterladen und mit einem
<script>
Tag versehen. Für diese Demo werde ich es von jsDelivr laden.Graphem-Splitter gibt uns eine
GraphemeSplitter
Klasse mit drei Methoden:splitGraphemes
,iterateGraphemes
, undcountGraphemes
. Natürlich wollen wirsplitGraphemes
:Und da sind wir - eine Reihe von drei Graphemen, was Sie wahrscheinlich wollten.
quelle
Sie können über die Länge der Zeichenfolge iterieren und das Zeichen an jeder Position verschieben :
quelle
"😃".charAt(0)
wird einen unbrauchbaren Charakter zurückgeben.split("")
die schnellste Option.split("")
scheint in Firefox stark optimiert werden. Während die Schleife eine ähnliche Leistung in Chrom und Firefox aufweist, ist die Aufteilung in Firefox für kleine und große Eingaben erheblich schneller.einfache Antwort:
quelle
Eine Möglichkeit ist die nächste:
quelle
Wie wäre es damit?
quelle
Array.prototype.slice erledigt die Arbeit ebenfalls.
quelle