¿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','!']
javascript
arrays
string
DarkLightA
fuente
fuente
"𨭎".split('')
resultados en["�", "�"]
."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:
Sugiero usar una de las siguientes características de ES2015 para manejar correctamente estas secuencias de caracteres.
Sintaxis extendida ( ya respondida por insertusernamehere)
Array.from
u
Bandera RegExpUsar 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 ):
Tenga en cuenta que Babel también trata de manejar sustitutos inigualables correctamente. Sin embargo, esto no parece funcionar para sustitutos bajos sin igual.
Prueba todo en tu navegador:
Mostrar fragmento de código
fuente
🏳️🌈
, 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
sintaxisPuede usar la sintaxis de propagación , un Array Initializer introducido en el estándar ECMAScript 2015 (ES6) :
Ejemplos
Los primeros tres resultan en:
El último da como resultado
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
Probar antes de comprar
fuente
También puedes usar
Array.from
.Este método se ha introducido en ES6.
Referencia
Array.from
fuente
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:
No necesariamente correcto o incorrecto, solo otra opción.
Object.assign se describe bien en el sitio MDN.
fuente
Array.from("Hello, world")
.[..."Hello, world"]
Ya es:
O para una versión anterior más amigable para el navegador, use:
fuente
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.
División en unidades de código UTF-16
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 hacesomeString[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 ...
También hay varias formas cortas de lograr lo mismo, como usar
.split()
con la cadena vacía como separador: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:División en puntos de código Unicode
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:Podemos acortar este uso
Array.from
, que itera sobre el iterable que se pasa implícitamente: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).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.
Dividirse en grafemas
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
, ycountGraphemes
. Naturalmente, queremossplitGraphemes
:Y ahí estamos: una serie de tres grafemas, que es probablemente lo que querías.
fuente
Puede iterar sobre la longitud de la cadena y empujar el carácter en cada posición :
fuente
"😃".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:
fuente
Una posibilidad es la siguiente:
fuente
¿Qué tal esto?
fuente
Array.prototype.slice también hará el trabajo.
fuente