Me gustaría alertar a cada letra individual de una cadena, pero no estoy seguro de cómo hacerlo.
Entonces, si tengo:
var str = 'This is my string';
Me gustaría poder alertar por separado T, h, i, s, etc. Esto es solo el comienzo de una idea en la que estoy trabajando, pero necesito saber cómo procesar cada letra por separado.
Quiero usar jQuery y estaba pensando que podría necesitar usar la función de división después de probar cuál es la longitud de la cadena.
Ideas?
javascript
jquery
string
Nic Hubbard
fuente
fuente
for(const c of str) { ... }
. Más de eso más abajo en una respuesta bastante detallada pero no suficientemente votada. PD: el enlace de @ ARJUN no funciona para mí.Respuestas:
Si el orden de las alertas es importante, use esto:
Si el orden de las alertas no importa, use esto:
Mostrar fragmento de código
fuente
[]
IE para obtener el carácter en una posición específica no es compatible con IE <9charAt
Queda de los días de UCS-2 cuando no había pares sustitutos y para abordar el problema,codepointAt
se agregó una nueva función a JavaScript que maneja correctamente nuestro amistoso montón de popó. Creo que Java también lo tiene.Probablemente esté más que resuelto. Solo quiero contribuir con otra solución simple:
fuente
[...text].forEach(console.log)
forEach()
pasa el índice y la matriz como segundo y tercer argumento. Preferiría no registrar eso ...for (let c of [...text]) { console.log(c) }
let c of text
Ya hace el trabajo.Una posible solución en javascript puro:
fuente
Cómo procesar cada letra de texto (con puntos de referencia)
https://jsperf.com/str-for-in-of-foreach-map-2para
Clásico y, con mucho, el que tiene el mayor rendimiento . Debería optar por este si planea utilizarlo en un algoritmo de rendimiento crítico, o si requiere la máxima compatibilidad con las versiones del navegador.
para ... de
for ... of es el nuevo ES6 para iterador. Compatible con la mayoría de los navegadores modernos. Es visualmente más atractivo y es menos propenso a errores de tipeo. Si va a utilizar este en una aplicación de producción, probablemente debería estar utilizando un transpilador como Babel .
para cada
Enfoque funcional . Airbnb aprobado . El mayor inconveniente de hacerlo de esta manera es
split()
que crea una nueva matriz para almacenar cada letra individual de la cadena.o
Los siguientes son los que no me gustan.
para ... en
A diferencia de ... de, obtienes el índice de la letra en lugar de la letra. Funciona bastante mal.
mapa
Enfoque funcional, que es bueno. Sin embargo, el mapa no está destinado a ser utilizado para eso. Debe usarse cuando necesite cambiar los valores dentro de una matriz, que no es el caso.
o
fuente
for
bucle clásico fue en realidad el segundo más lento, mientras quefor...of
fue el más rápido (aproximadamente tres veces más rápido quefor
).for
ciclo siendo un poco más rápido.La mayoría de las respuestas, si no todas, son incorrectas porque se romperán cuando haya un carácter en la cadena fuera del Unicode BMP (Plano multilingüe básico) . Eso significa que todos los Emoji estarán rotos .
JavaScript utiliza UTF- 16 Unicode para todas las cadenas. En UTF-16, los caracteres más allá del BMP están formados por dos partes, llamadas " Par sustituto " y la mayoría de las respuestas aquí procesarán cada parte de dichos pares individualmente en lugar de un solo carácter.
Una forma en JavaScript moderno desde al menos 2016 es usar el nuevo iterador de cadena . Aquí está el ejemplo (casi) directamente de MDN:
fuente
Puedes probar esto
fuente
Una solución más ...
fuente
for..of
buclefor (let ch of t) { alert(ch) }
Cuando necesito escribir un código corto o una línea, utilizo este "hack":
Esto no contará nuevas líneas, por lo que puede ser algo bueno o malo. Si desea incluir nuevas líneas, reemplace:
/./
con/[\S\s]/
. Las otras frases que puede ver probablemente usen, lo.split()
que tiene muchos problemasfuente
forEach
función de la llamada frente a los parámetros enviadosreplace
. Si sé que estoy ASCIIANDO, creo que todavía tengo algunos casos de uso parasplit
. ¡Gran respuesta, sin embargo!u
bandera junto con lag
bandera. OK solo probé y tenía razón.El nuevo JS permite esto:
fuente
Es mejor usar la instrucción for ... of, si la cadena contiene caracteres unicode, debido al diferente tamaño de byte.
fuente
respuesta corta:
Array.from(string)
te dará lo que probablemente quieras y luego podrás repetirlo o lo que sea, ya que es solo una matriz.ok vamos a intentarlo con esta cadena:
abc|⚫️\n⚪️|👨👩👧👧
.los puntos de código son:
entonces algunos caracteres tienen un punto de código (byte) y algunos tienen dos o más, y se agrega una nueva línea para pruebas adicionales.
así que después de probar hay dos formas:
fuente
Ahora puede iterar sobre puntos de código Unicode individuales contenidos en una Cadena mediante el uso
String.prototype[@@iterator]
, que devuelve un valor de tipo de símbolo bien conocidoSymbol.iterator
: el iterador predeterminado para objetos tipo matriz (String
en este caso).Código de ejemplo:
Esto funciona con caracteres Unicode, como emoji o caracteres no romanos que tropezarían con construcciones heredadas.
Referencia: MDN Link to String.prototype @@ iterator .
fuente
for ... of
bucle también sobre la cadena, que es el azúcar de sintaxis para acceder al iterador.Ahora puede usar en palabras clave.
fuente
in
es una parte legítima del lenguaje. Usa las cosas apropiadamente. Su artículo advierte quein
interpreta las teclas alfa igual que las teclas numéricas. ¿Entonces? Tal vez eso es lo que quieres. También se podría decir que otros métodos ignoran incorrectamente las claves alfa. Imo,of
tiene el comportamiento correcto. En las matrices JS, los elementos sin claves alfa aún tienen claves: numéricas. En mi consola, JS trata "correctamente" la clave alfa igual que las teclas numéricas:>const arr = ['a', 'b'] >arr.test = 'hello' >arr 0: "a" 1: "b" test: "hello" length: 2
Puede obtener una variedad de los caracteres individuales de esta manera
y luego bucle usando Javascript regular, o puede iterar sobre los caracteres de la cadena usando jQuery por
fuente
puede convertir esta cadena en una matriz de caracteres utilizando
split()
, luego iterar a través de ella.fuente
Si desea realizar una transformación en el texto a nivel de caracteres y recuperar el texto transformado al final, debería hacer algo como esto:
Entonces los pasos:
fuente
En el JavaScript de hoy puedes
Array.prototype.map.call('This is my string', (c) => c+c)
Obviamente, c + c representa lo que quieras hacer con c.
Esto vuelve
["TT", "hh", "ii", "ss", " ", "ii", "ss", " ", "mm", "yy", " ", "ss", "tt", "rr", "ii", "nn", "gg"]
fuente
[...'This is my string'].map((c)=>c+c)
Esto debería funcionar en navegadores antiguos y con caracteres UTF-16 como 💩.
Esta debería ser la solución más compatible. Sin embargo, es menos eficaz de lo que
for
sería un bucle.Genere la expresión regular usando regexpu
¡Espero que esto ayude!
fuente
Puede acceder a caracteres individuales con
str.charAt(index)
ostr[index]
. Pero la última forma no es parte de ECMAScript, por lo que es mejor que elija la primera.fuente
Si desea animar cada personaje, es posible que necesite envolverlo en el elemento span;
Creo que esta es la mejor manera de hacerlo, luego procesar los tramos. (por ejemplo con TweenMax)
TweenMax.staggerFromTo ($ demoText.find ("span"), 0.2, {autoAlpha: 0}, {autoAlpha: 1}, 0.1);
fuente
Prueba este código
fuente