Come si converte una stringa in una matrice di caratteri in JavaScript?
Sto pensando di ottenere una stringa simile "Hello world!"
all'array
['H','e','l','l','o',' ','w','o','r','l','d','!']
Come si converte una stringa in una matrice di caratteri in JavaScript?
Sto pensando di ottenere una stringa simile "Hello world!"
all'array
['H','e','l','l','o',' ','w','o','r','l','d','!']
Risposte:
Nota: questo non è conforme agli Unicode.
"I💖U".split('')
genera un array di 4 caratteri["I", "�", "�", "u"]
che può portare a bug pericolosi. Vedi le risposte di seguito per alternative sicure.
Basta dividerlo per una stringa vuota.
var output = "Hello world!".split('');
console.log(output);
"randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
non indica il numero di caratteri nella stringa, poiché alcuni caratteri occupano più spazio di altri; str.length
ti dice il numero di numeri a 16 bit.
Come suggerisce hippietrail , la risposta del mediatore può rompere le coppie surrogate e interpretare erroneamente i "personaggi". Per esempio:
// DO NOT USE THIS!
> '𝟘𝟙𝟚𝟛'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]
Suggerisco di utilizzare una delle seguenti funzioni ES2015 per gestire correttamente queste sequenze di caratteri.
> [...'𝟘𝟙𝟚𝟛']
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
> Array.from('𝟘𝟙𝟚𝟛')
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
u
Flag RegExp> '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u)
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Utilizzare /(?=[\s\S])/u
invece di /(?=.)/u
perché .
non corrisponde alle nuove righe .
Se sei ancora nell'era ES5.1 (o se il tuo browser non gestisce correttamente questa regex - come Edge), puoi usare questa alternativa (tradotta da Babel ):
> '𝟘𝟙𝟚𝟛'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Si noti che Babele cerca anche di gestire correttamente surrogati senza pari. Tuttavia, questo non sembra funzionare per surrogati bassi senza eguali.
🏳️🌈
, e si divide combinando segni diacritici dai personaggi. Se si desidera suddividere in cluster grapheme anziché caratteri, consultare stackoverflow.com/a/45238376 .
La spread
sintassi
È possibile utilizzare la sintassi di diffusione , un inizializzatore di array introdotto nello standard ECMAScript 2015 (ES6) :
var arr = [...str];
Esempi
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);
I primi tre risultati in:
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]
L'ultimo risulta in
{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}
Supporto per il browser
Controllare la tabella di compatibilità ECMAScript ES6 .
Ulteriori letture
spread
viene anche indicato come " splat
" (ad esempio in PHP o Ruby o come " scatter
" (ad esempio in Python ).
dimostrazione
Puoi anche usare Array.from
.
var m = "Hello world!";
console.log(Array.from(m))
Questo metodo è stato introdotto in ES6.
Questa è una vecchia domanda ma mi sono imbattuto in un'altra soluzione non ancora elencata.
È possibile utilizzare la funzione Object.assign per ottenere l'output desiderato:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
Non necessariamente giusto o sbagliato, solo un'altra opzione.
Array.from("Hello, world")
.
[..."Hello, world"]
È già:
var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'
O per una versione più vecchia del browser, utilizzare:
var mystring = 'foobar';
console.log(mystring.charAt(3)); // Outputs 'b'
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
.
charAt()
- anche se preferirei usare la variante array-ish. Darn IE.
Ci sono (almeno) tre cose diverse che potresti concepire come un "personaggio" e, di conseguenza, tre diverse categorie di approccio che potresti voler usare.
Le stringhe JavaScript sono state originariamente inventate come sequenze di unità di codice UTF-16, in un punto della storia in cui esisteva una relazione uno a uno tra unità di codice UTF-16 e punti di codice Unicode. La .length
proprietà di una stringa misura la sua lunghezza in unità UTF-16 del codice, e quando lo fai someString[i]
si ottiene il I ° UTF-16 unità di codicesomeString
.
Di conseguenza, è possibile ottenere una matrice di unità di codice UTF-16 da una stringa utilizzando un for-loop in stile C con una variabile indice ...
const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
charArray.push(yourString[i]);
}
console.log(charArray);
Esistono anche diversi modi per ottenere la stessa cosa, come usare .split()
con la stringa vuota come separatore:
const charArray = 'Hello, World!'.split('');
console.log(charArray);
Tuttavia, se la stringa contiene punti di codice costituiti da più unità di codice UTF-16, ciò li suddividerà in singole unità di codice, che potrebbero non essere quelle desiderate. Ad esempio, la stringa '𝟘𝟙𝟚𝟛'
è composta da quattro punti di codice unicode (punti di codice da 0x1D7D8 a 0x1D7DB) che, in UTF-16, sono ciascuno composto da due unità di codice UTF-16. Se dividiamo quella stringa usando i metodi sopra, otterremo una matrice di otto unità di codice:
const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);
Quindi, forse vogliamo invece dividere la nostra stringa in punti di codice Unicode! Questo è stato possibile da quando ECMAScript 2015 ha aggiunto il concetto di iterabile alla lingua. Le stringhe ora sono iterabili e quando si esegue l'iterazione su di esse (ad es. Con un for...of
ciclo), si ottengono punti di codice Unicode, non unità di codice UTF-16:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = [];
for (const char of yourString) {
charArray.push(char);
}
console.log(charArray);
Possiamo abbreviare questo usando Array.from
, che scorre sull'iterabile che è passato implicitamente:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = Array.from(yourString);
console.log(charArray);
Tuttavia, punti di codice Unicode non sono il più grande cosa possibile che potrebbe essere considerato un "carattere" o . Alcuni esempi di cose che potrebbero ragionevolmente essere considerati un singolo "carattere" ma che possono essere costituiti da più punti di codice includono:
Di seguito possiamo vedere che se proviamo a convertire una stringa con tali caratteri in un array tramite il meccanismo di iterazione sopra, i caratteri vengono suddivisi nell'array risultante. (Nel caso in cui uno dei personaggi non venga visualizzato sul tuo sistema, di yourString
seguito è presente una A maiuscola con un accento acuto, seguita dalla bandiera del Regno Unito, seguita da una donna di colore.)
const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);
Se vogliamo mantenere ognuno di questi come un singolo oggetto nel nostro array finale, allora abbiamo bisogno di un array di grafemi , non di punti di codice.
JavaScript non ha supporto integrato per questo - almeno non ancora. Quindi abbiamo bisogno di una libreria che comprenda e implementi le regole Unicode per quale combinazione di punti di codice costituisce un grafo. Fortunatamente ne esiste uno: il frammento di grafema di Orling . Ti consigliamo di installarlo con npm o, se non stai utilizzando npm, scarica il file index.js e servilo con un <script>
tag. Per questa demo, lo caricherò da jsDelivr.
grafema-splitter ci dà una GraphemeSplitter
classe con tre metodi: splitGraphemes
, iterateGraphemes
, e countGraphemes
. Naturalmente, vogliamo splitGraphemes
:
const splitter = new GraphemeSplitter();
const yourString = 'Á🇬🇧👩🏿';
const charArray = splitter.splitGraphemes(yourString);
console.log(charArray);
<script src="https://cdn.jsdelivr.net/npm/grapheme-splitter@1.0.4/index.js"></script>
Ed eccoci qui - una schiera di tre grafemi, che è probabilmente quello che volevi.
Puoi iterare sulla lunghezza della stringa e spingere il carattere in ogni posizione :
const str = 'Hello World';
const stringToArray = (text) => {
var chars = [];
for (var i = 0; i < text.length; i++) {
chars.push(text[i]);
}
return chars
}
console.log(stringToArray(str))
"😃".charAt(0)
restituirà un personaggio inutilizzabile
.split("")
nuovo l'opzione più veloce
.split("")
Sembra anche essere fortemente ottimizzato in Firefox. Mentre il loop ha prestazioni simili in Chrome e Firefox diviso è significativamente più veloce in Firefox per input piccoli e grandi.
risposta semplice:
let str = 'this is string, length is >26';
console.log([...str]);
Una possibilità è la prossima:
console.log([1, 2, 3].map(e => Math.random().toString(36).slice(2)).join('').split('').map(e => Math.random() > 0.5 ? e.toUpperCase() : e).join(''));
Cosa ne pensi di questo?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array.prototype.slice farà anche il lavoro.
const result = Array.prototype.slice.call("Hello world!");
console.log(result);
"𨭎".split('')
risultati in["�", "�"]
.