¿Cómo se convierte una cadena en una matriz de caracteres en JavaScript?
Estoy pensando en obtener una cadena como "Hello world!"
en la matriz
['H','e','l','l','o',' ','w','o','r','l','d','!']
¿Cómo se convierte una cadena en una matriz de caracteres en JavaScript?
Estoy pensando en obtener una cadena como "Hello world!"
en la matriz
['H','e','l','l','o',' ','w','o','r','l','d','!']
Respuestas:
Nota: Esto no es compatible con Unicode.
"I💖U".split('')
da como resultado la matriz de 4 caracteres["I", "�", "�", "u"]
que puede conducir a errores peligrosos. Vea las respuestas a continuación para alternativas seguras.
Simplemente divídalo por una cadena vacía.
var output = "Hello world!".split('');
console.log(output);
"randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
no le indica el número de caracteres en la cadena, ya que algunos caracteres ocupan más espacio que otros; str.length
le dice el número de números de 16 bits.
Como sugiere hippietrail , la respuesta de meder puede romper pares sustitutos y malinterpretar "personajes". Por ejemplo:
// DO NOT USE THIS!
> '𝟘𝟙𝟚𝟛'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]
Sugiero usar una de las siguientes características de ES2015 para manejar correctamente estas secuencias de caracteres.
> [...'𝟘𝟙𝟚𝟛']
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
> Array.from('𝟘𝟙𝟚𝟛')
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
u
Bandera RegExp> '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u)
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Usar en /(?=[\s\S])/u
lugar de /(?=.)/u
porque .
no coincide con las nuevas líneas .
Si todavía está en la era ES5.1 (o si su navegador no maneja esta expresión regular correctamente, como Edge), puede usar esta alternativa (transpilada por Babel ):
> '𝟘𝟙𝟚𝟛'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Tenga en cuenta que Babel también trata de manejar sustitutos inigualables correctamente. Sin embargo, esto no parece funcionar para sustitutos bajos sin igual.
🏳️🌈
, y divide la combinación de signos diacríticos de los personajes. Si desea dividirse en grupos de grafemas en lugar de caracteres, consulte stackoverflow.com/a/45238376 .
La spread
sintaxis
Puede usar la sintaxis de propagación , un Array Initializer introducido en el estándar ECMAScript 2015 (ES6) :
var arr = [...str];
Ejemplos
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);
Los primeros tres resultan en:
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]
El último da como resultado
{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}
Soporte de navegador
Consulte la tabla de compatibilidad de ECMAScript ES6 .
Otras lecturas
spread
también se menciona como " splat
" (por ejemplo, en PHP o Ruby o como " scatter
" (por ejemplo, en Python ).
Manifestación
También puedes usar Array.from
.
var m = "Hello world!";
console.log(Array.from(m))
Este método se ha introducido en ES6.
Esta es una vieja pregunta, pero encontré otra solución que aún no figura en la lista.
Puede usar la función Object.assign para obtener la salida deseada:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
No necesariamente correcto o incorrecto, solo otra opción.
Array.from("Hello, world")
.
[..."Hello, world"]
Ya es:
var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'
O para una versión anterior más amigable para el navegador, use:
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()
aunque preferiría usar la variante array-ish. Maldición IE.
Hay (al menos) tres cosas diferentes que podría concebir como un "personaje" y, en consecuencia, tres categorías diferentes de enfoque que puede utilizar.
Las cadenas de JavaScript se inventaron originalmente como secuencias de unidades de código UTF-16, en un punto de la historia cuando había una relación uno a uno entre las unidades de código UTF-16 y los puntos de código Unicode. La .length
propiedad de una cadena mide su longitud en unidades de código UTF-16, y cuando lo hace someString[i]
, obtiene la i ª unidad de código UTF-16 desomeString
.
En consecuencia, puede obtener una matriz de unidades de código UTF-16 de una cadena utilizando un bucle for de estilo C con una variable de índice ...
const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
charArray.push(yourString[i]);
}
console.log(charArray);
También hay varias formas cortas de lograr lo mismo, como usar .split()
con la cadena vacía como separador:
const charArray = 'Hello, World!'.split('');
console.log(charArray);
Sin embargo, si su cadena contiene puntos de código que están formados por múltiples unidades de código UTF-16, esto los dividirá en unidades de código individuales, que pueden no ser lo que desea. Por ejemplo, la cadena '𝟘𝟙𝟚𝟛'
se compone de cuatro puntos de código unicode (puntos de código 0x1D7D8 a 0x1D7DB) que, en UTF-16, están formados por dos unidades de código UTF-16. Si dividimos esa cadena usando los métodos anteriores, obtendremos una matriz de ocho unidades de código:
const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);
Entonces, ¡tal vez queremos dividir nuestra cadena en puntos de código Unicode! Eso ha sido posible desde que ECMAScript 2015 agregó el concepto de un iterable al lenguaje. Las cadenas ahora son iterables, y cuando iteras sobre ellas (por ejemplo, con un for...of
bucle), obtienes puntos de código Unicode, no unidades de código UTF-16:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = [];
for (const char of yourString) {
charArray.push(char);
}
console.log(charArray);
Podemos acortar este uso Array.from
, que itera sobre el iterable que se pasa implícitamente:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = Array.from(yourString);
console.log(charArray);
Sin embargo, los puntos de código Unicode no son los más grandes que sea posible que, posiblemente, podría ser considerado un "carácter" o bien . Algunos ejemplos de cosas que razonablemente podrían considerarse un solo "personaje" pero que se componen de múltiples puntos de código incluyen:
Podemos ver a continuación que si intentamos convertir una cadena con tales caracteres en una matriz a través del mecanismo de iteración anterior, los caracteres terminan divididos en la matriz resultante. (En caso de que alguno de los caracteres no aparezca en su sistema, a yourString
continuación se incluye una A mayúscula con un acento agudo, seguida de la bandera del Reino Unido, seguida de una mujer negra).
const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);
Si queremos mantener cada uno de estos como un solo elemento en nuestro conjunto final, entonces necesitamos un conjunto de grafemas , no puntos de código.
JavaScript no tiene soporte incorporado para esto, al menos no todavía. Por lo tanto, necesitamos una biblioteca que comprenda e implemente las reglas Unicode sobre qué combinación de puntos de código constituye un grafema. Afortunadamente, existe uno: el divisor de grafemas de Orling . Querrá instalarlo con npm o, si no está usando npm, descargue el archivo index.js y sirva con una <script>
etiqueta. Para esta demostración, la cargaré desde jsDelivr.
grafema-divisor nos da una GraphemeSplitter
clase con tres métodos: splitGraphemes
, iterateGraphemes
, y countGraphemes
. Naturalmente, queremos 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>
Y ahí estamos: una serie de tres grafemas, que es probablemente lo que querías.
Puede iterar sobre la longitud de la cadena y empujar el carácter en cada posición :
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)
devolverá un personaje inutilizable
.split("")
la opción más rápida
.split("")
parece estar muy optimizado en Firefox. Si bien el bucle tiene un rendimiento similar en Chrome y Firefox, la división es significativamente más rápida en Firefox para entradas pequeñas y grandes.
respuesta simple:
let str = 'this is string, length is >26';
console.log([...str]);
Una posibilidad es la siguiente:
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(''));
¿Qué tal esto?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array.prototype.slice también hará el trabajo.
const result = Array.prototype.slice.call("Hello world!");
console.log(result);
"𨭎".split('')
resultados en["�", "�"]
.