Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge?

Lesezeit: 8 Minuten

Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge
DarkLightA

Wie konvertiert man in JavaScript eine Zeichenfolge in ein Zeichenarray?

Ich denke, ich bekomme eine Zeichenfolge wie "Hello world!" zum Array
['H','e','l','l','o',' ','w','o','r','l','d','!']

Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge
meder omuraliew

Hinweis: Dies ist nicht Unicode-kompatibel. "I💖U".split('') ergibt das 4-Zeichen-Array ["I", "�", "�", "u"] was zu gefährlichen Fehlern führen kann. Siehe Antworten unten für sichere Alternativen.

Teilen Sie es einfach durch eine leere Zeichenfolge.

var output = "Hello world!".split('');
console.log(output);

Siehe die String.prototype.split() MDN-Dokumente.

  • Dies berücksichtigt keine Ersatzpaare. "𨭎".split('') ergibt sich ["�", "�"].

    – Hippiepfad

    13. Februar 2015 um 18:15 Uhr

  • Siehe die Antwort von @hakatashi an anderer Stelle in diesem Thread. Hoffentlich sieht das jeder… VERWENDEN SIE DIESE METHODE NICHT, SIE IST NICHT UNICODE-SICHER

    – i336_

    5. Februar 2016 um 4:22 Uhr


  • Bisschen spät zur Party. Aber warum sollte jemand jemals ein Array aus einer Zeichenfolge erstellen wollen? Ein String ist bereits ein Array oder irre ich mich? "randomstring".length; //12 "randomstring"[2]; //"n"

    – Luigi van der Pal

    8. Dezember 2016 um 11:19 Uhr


  • @LuigivanderPal Ein String ist kein Array, aber sehr ähnlich. Es ist jedoch nicht mit einem Array von Zeichen vergleichbar. Ein String ähnelt einem Array von 16-Bit-Zahlen, von denen einige Zeichen und einige die Hälfte eines Ersatzpaares darstellen. Zum Beispiel, str.length gibt Ihnen nicht die Anzahl der Zeichen in der Zeichenfolge an, da einige Zeichen mehr Platz benötigen als andere; str.length gibt Ihnen die Anzahl der 16-Bit-Zahlen an.

    – Theodor Norvell

    5. April 2019 um 13:00 Uhr

Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge
hakatashi

Wie Hippietrail andeutet, kann Meders Antwort Ersatzpaare brechen und „Charaktere“ falsch interpretieren. Zum Beispiel:

// DO NOT USE THIS!
const a="𝟘𝟙𝟚𝟛".split('');
console.log(a);
// Output: ["�","�","�","�","�","�","�","�"]

Ich schlage vor, eine der folgenden ES2015-Funktionen zu verwenden, um diese Zeichenfolgen korrekt zu verarbeiten.

Spread-Syntax (bereits beantwortet von insertusernamehere)

const a = [...'𝟘𝟙𝟚𝟛'];
console.log(a);

Array.von

const a = Array.from('𝟘𝟙𝟚𝟛');
console.log(a);

RegExp u Flagge

const a="𝟘𝟙𝟚𝟛".split(/(?=[\s\S])/u);
console.log(a);

Verwenden /(?=[\s\S])/u anstatt /(?=.)/u da . stimmt nicht mit Zeilenumbrüchen überein. Wenn Sie sich noch in der ES5.1-Ära befinden (oder wenn Ihr Browser diesen Regex nicht richtig verarbeitet – wie Edge), können Sie die folgende Alternative (transpiled by Babel). Beachten Sie, dass Babel versucht, auch nicht übereinstimmende Surrogate korrekt zu handhaben. Dies scheint jedoch nicht für unerreicht niedrige Surrogate zu funktionieren.

const a="𝟘𝟙𝟚𝟛".split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
console.log(a);

Reduce-Methode (bereits von Mark Amery beantwortet)

const s="𝟘𝟙𝟚𝟛";
const a = [];
for (const s2 of s) {
   a.push(s2);
}
console.log(a);

  • Beachten Sie, dass diese Lösung einige Emojis wie z 🏳️‍🌈, und trennt das Kombinieren diakritischer Zeichen von Zeichen. Wenn Sie anstelle von Zeichen in Graphem-Cluster aufteilen möchten, siehe stackoverflow.com/a/45238376.

    – Benutzer202729

    30. August 2018 um 6:21 Uhr


  • Beachten Sie, dass es zwar großartig ist, Ersatzpaare nicht zu trennen, aber keine Allzwecklösung zum Aufbewahren von “Zeichen” (oder genauer gesagt, Grapheme) zusammen. Ein Graphem kann aus mehreren Codepunkten bestehen; Zum Beispiel ist der Name der Sprache Devanagari “देवनागरी”, was von einem Muttersprachler als fünf Grapheme gelesen wird, aber acht Codepunkte benötigt, um zu produzieren …

    – TJ Crowder

    17. September 2018 um 12:08 Uhr

  • Auf diese Antwort wird in der offiziellen Mozilla-Dokumentation unter verwiesen developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – Zefiro

    5. Juni 2021 um 22:48 Uhr

1646255110 818 Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge
Benutzernamen hier einfügen

Die spread Syntax

Du kannst den … benutzen Spread-Syntaxein Array-Initialisierer, der in eingeführt wurde ECMAScript 2015 (ES6)-Standard:

var arr = [...str];

Beispiele

function a() {
    return arguments;
}

var str="Hello World";

var arr1 = [...str],
    arr2 = [...'Hello World'],
    arr3 = new Array(...str),
    arr4 = a(...str);

console.log(arr1, arr2, arr3, arr4);

Die ersten drei ergeben:

["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]

Letzteres ergibt

{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}

Browser-Unterstützung

Überprüf den ECMAScript ES6-Kompatibilitätstabelle.


Weiterlesen

spread wird auch bezeichnet als „splat“ (zB im PHP oder Rubin oder als “scatter“ (zB im Python).


Demo

Probieren Sie es vor dem Kauf aus

  • Wenn Sie den Spread-Operator in Kombination mit einem Compiler für ES5 verwenden, funktioniert dies im IE nicht. Berücksichtigen Sie das. Ich brauchte Stunden, um herauszufinden, was das Problem war.

    – Stefan van den Berg

    21. Juni 2017 um 12:06 Uhr

1646255110 170 Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge
Rajesh

Sie können auch verwenden Array.from.

var m = "Hello world!";
console.log(Array.from(m))

Diese Methode wurde in ES6 eingeführt.

Referenz

Array.von

1646255111 486 Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge
Markus Amery

Es gibt (mindestens) drei verschiedene Dinge, die Sie sich unter einem „Charakter“ vorstellen können, und folglich drei verschiedene Kategorien von Herangehensweisen, die Sie verwenden möchten.

Aufteilung in UTF-16-Codeeinheiten

JavaScript-Strings 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 einer Zeichenfolge misst ihre Länge in UTF-16-Codeeinheiten, und wenn Sie dies tun someString[i] du bekommst die ichte UTF-16-Codeeinheit von someString.

Folglich können Sie ein Array von UTF-16-Codeeinheiten aus einer Zeichenfolge erhalten, indem Sie eine for-Schleife im C-Stil mit einer Indexvariablen verwenden …

const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
    charArray.push(yourString[i]);
}
console.log(charArray);

Es gibt auch verschiedene kurze Wege, um dasselbe zu erreichen, wie z. B. using .split() mit dem leeren String als Trennzeichen:

const charArray = 'Hello, World!'.split('');
console.log(charArray);

Wenn Ihre Zeichenfolge jedoch Codepunkte enthält, die aus mehreren UTF-16-Codeeinheiten bestehen, werden sie dadurch in einzelne Codeeinheiten aufgeteilt, was möglicherweise nicht Ihren Wünschen entspricht. Zum Beispiel die Zeichenfolge '𝟘𝟙𝟚𝟛' besteht 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 obigen Methoden aufteilen, erhalten wir ein Array von acht Codeeinheiten:

const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);

Aufteilung in Unicode-Codepunkte

Vielleicht möchten wir unsere Zeichenfolge stattdessen in Unicode-Codepunkte aufteilen! Dies ist möglich, seit ECMAScript 2015 das Konzept einer hinzugefügt hat wiederholbar zur Sprache. Strings sind jetzt iterierbar, und wenn Sie über sie iterieren (z. B. mit a for...of Schleife), erhalten Sie Unicode-Codepunkte, keine UTF-16-Codeeinheiten:

const yourString = '𝟘𝟙𝟚𝟛';
const charArray = [];
for (const char of yourString) {
  charArray.push(char);
}
console.log(charArray);

Wir können dies mit verkürzen Array.fromdie über das Iterable iteriert, das implizit übergeben wird:

const yourString = '𝟘𝟙𝟚𝟛';
const charArray = Array.from(yourString);
console.log(charArray);

Unicode-Codepunkte sind jedoch nicht das Größtmögliche, das möglicherweise als “Zeichen” betrachtet werden könnte. entweder. Einige Beispiele für Dinge, die vernünftigerweise als ein einzelnes “Zeichen” angesehen werden könnten, aber aus mehreren Codepunkten bestehen, sind:

  • Zeichen mit Akzent, wenn der Akzent mit einem Kombinationscodepunkt angewendet wird
  • Flaggen
  • Einige Emojis

Wir können unten sehen, dass, wenn wir versuchen, einen String mit solchen Zeichen über den obigen Iterationsmechanismus in ein Array umzuwandeln, die Zeichen im resultierenden Array aufgelöst werden. (Falls eines der Zeichen auf Ihrem System nicht gerendert wird, yourString unten besteht aus einem Kapital EIN mit akutem Akzent, gefolgt von der Flagge des Vereinigten Königreichs, gefolgt von einer schwarzen Frau.)

const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);

Wenn wir jedes dieser Elemente als einzelnes Element in unserem endgültigen Array behalten möchten, benötigen wir ein Array von Graphemekeine Codepunkte.

Aufspaltung in Grapheme

JavaScript hat dafür keine eingebaute Unterstützung – zumindest noch nicht. Wir brauchen also eine Bibliothek, die die Unicode-Regeln dafür versteht und implementiert, welche Kombination von Codepunkten ein Graphem darstellt. Zum Glück gibt es einen: Orling’s Graphem-Splitter. Sie sollten es mit npm installieren oder, wenn Sie npm nicht verwenden, die Datei index.js herunterladen und mit a bereitstellen <script> Schild. Für diese Demo lade ich sie von jsDelivr.

grapheme-splitter gibt uns a GraphemeSplitter Klasse mit drei Methoden: splitGraphemes, iterateGraphemesund countGraphemes. Natürlich wollen wir splitGraphemes:

const splitter = new GraphemeSplitter();
const yourString = 'Á🇬🇧👩🏿';
const charArray = splitter.splitGraphemes(yourString);
console.log(charArray);
<script src="https://cdn.jsdelivr.net/npm/[email protected]/index.js"></script>

Und da sind wir – ein Array aus drei Graphemen, das ist wahrscheinlich was du wolltest.

  • Das war so hilfreich. Hat mich wirklich bei einem Projekt gerettet, an dem ich arbeite. Danke!!!

    – Raddevus

    24. Januar 2021 um 22:20 Uhr

1646255111 318 Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge
gehashter_name

Dies ist eine alte Frage, aber ich bin auf eine andere Lösung gestoßen, die noch nicht aufgeführt ist.

Sie können die Funktion Object.assign verwenden, um die gewünschte Ausgabe zu erhalten:

var output = Object.assign([], "Hello, world!");
console.log(output);
    // [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]

Nicht unbedingt richtig oder falsch, nur eine weitere Option.

Object.assign ist auf der MDN-Site gut beschrieben.

  • Das war so hilfreich. Hat mich wirklich bei einem Projekt gerettet, an dem ich arbeite. Danke!!!

    – Raddevus

    24. Januar 2021 um 22:20 Uhr

1646255111 318 Wie bekomme ich ein Zeichenarray aus einer Zeichenfolge
gehashter_name

Es ist schon:

var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'

Oder verwenden Sie für eine ältere browserfreundliche Version:

var mystring = 'foobar';
console.log(mystring.charAt(3)); // Outputs 'b'

  • -1: ist es nicht. Versuch es: alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])

    – R.Martinho Fernandes

    28. Dezember 2010 um 16:48 Uhr


  • Es tut uns leid. Ich denke, was ich sagen wollte, ist: “Sie können auf einzelne Zeichen per Indexreferenz wie dieser zugreifen, ohne ein Zeichenarray zu erstellen”.

    – dansimau

    28. Dezember 2010 um 16:50 Uhr


  • Nicht zuverlässig Cross-Browser können Sie nicht. Es ist eine Funktion von ECMAScript Fifth Edition.

    – Bobin

    28. Dezember 2010 um 17:25 Uhr

  • Die Cross-Browser-Version ist mystring.charAt(index).

    – psmay

    28. Dezember 2010 um 18:04 Uhr

  • +1 für charAt()–obwohl ich lieber die Array-artige Variante verwenden würde. Verdammter IE.

    – Zenexer

    4. Juli 2014 um 2:57 Uhr


916130cookie-checkWie bekomme ich ein Zeichenarray aus einer Zeichenfolge?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy