Como você converte uma string em uma matriz de caracteres em JavaScript?
Eu estou pensando em obter uma string como "Hello world!"
a matriz
['H','e','l','l','o',' ','w','o','r','l','d','!']
javascript
arrays
string
DarkLightA
fonte
fonte
"𨭎".split('')
resulta em["�", "�"]
."randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
não informa o número de caracteres na sequência, pois alguns caracteres ocupam mais espaço que outros;str.length
informa o número de números de 16 bits.Como sugere o hippietrail , a resposta do médico pode quebrar pares substitutos e interpretar mal os "caracteres". Por exemplo:
Sugiro usar um dos seguintes recursos do ES2015 para lidar corretamente com essas seqüências de caracteres.
Sintaxe de propagação ( já respondida por insertusernamehere)
Array.from
RegExp
u
bandeiraUse em
/(?=[\s\S])/u
vez de/(?=.)/u
porque.
não corresponde a novas linhas .Se você ainda está na era ES5.1 (ou se o navegador não manipula esse regex corretamente - como o Edge), você pode usar esta alternativa (transpilada por Babel ):
Observe que Babel também tenta manipular substitutos não correspondentes corretamente. No entanto, isso não parece funcionar para substitutos baixos incomparáveis.
Teste tudo no seu navegador:
Mostrar snippet de código
fonte
🏳️🌈
, e divide a combinação de sinais diacríticos de caracteres. Se você deseja dividir em clusters de grafema em vez de caracteres, consulte stackoverflow.com/a/45238376 .A
spread
sintaxeVocê pode usar a sintaxe de propagação , um Array Initializer introduzido no padrão ECMAScript 2015 (ES6) :
Exemplos
Os três primeiros resultam em:
O último resulta em
Suporte do navegador
Verifique a tabela de compatibilidade do ECMAScript ES6 .
Leitura adicional
spread
também é referenciado como "splat
" (por exemplo, em PHP ou Ruby ou como "scatter
" (por exemplo, em Python ).Demo
Experimente antes de comprar
fonte
Você também pode usar
Array.from
.Este método foi introduzido no ES6.
Referência
Array.from
fonte
Esta é uma pergunta antiga, mas me deparei com outra solução ainda não listada.
Você pode usar a função Object.assign para obter a saída desejada:
Não necessariamente certo ou errado, apenas outra opção.
Object.assign está bem descrito no site MDN.
fonte
Array.from("Hello, world")
.[..."Hello, world"]
Já é:
Ou, para uma versão mais antiga do navegador, use:
fonte
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
.charAt()
embora eu prefira usar a variante array-ish. Maldito IE.Existem (pelo menos) três coisas diferentes que você pode conceber como um "personagem" e, consequentemente, três categorias diferentes de abordagem que você pode querer usar.
Divisão em unidades de código UTF-16
As strings JavaScript foram originalmente inventadas como sequências de unidades de código UTF-16, em um ponto no histórico em que havia um relacionamento individual entre as unidades de código UTF-16 e os pontos de código Unicode. A
.length
propriedade de uma corda mede seu comprimento em UTF-16 unidades de código, e quando você fazsomeString[i]
você obter o i th unidade de código UTF-16 desomeString
.Conseqüentemente, você pode obter uma matriz de unidades de código UTF-16 de uma string usando um loop for do estilo C com uma variável de índice ...
Também existem várias maneiras curtas de conseguir a mesma coisa, como usar
.split()
a string vazia como separador:No entanto, se sua sequência contiver pontos de código compostos por várias unidades de código UTF-16, isso as dividirá em unidades de código individuais, que podem não ser o que você deseja. Por exemplo, a cadeia
'𝟘𝟙𝟚𝟛'
é composta de quatro pontos de código unicode (pontos de código 0x1D7D8 a 0x1D7DB) que, em UTF-16, são compostos por duas unidades de código UTF-16. Se dividirmos essa sequência usando os métodos acima, obteremos uma matriz de oito unidades de código:Divisão em pontos de código Unicode
Portanto, talvez desejemos dividir nossa string em pontos de código Unicode! Isso é possível desde que o ECMAScript 2015 adicionou o conceito de iterável ao idioma. As strings agora são iteráveis e, quando você as itera (por exemplo, com um
for...of
loop), obtém pontos de código Unicode, não unidades de código UTF-16:Podemos encurtar isso usando
Array.from
, que itera sobre o iterável que é passado implicitamente:No entanto, pontos de código Unicode não são a maior coisa que poderia possivelmente ser considerado um "caráter" quer . Alguns exemplos de coisas que poderiam razoavelmente ser consideradas um único "caractere", mas constituídos por vários pontos de código incluem:
Podemos ver abaixo que, se tentarmos converter uma string com esses caracteres em uma matriz por meio do mecanismo de iteração acima, os caracteres acabam sendo divididos na matriz resultante. (Caso algum dos personagens não seja renderizado em seu sistema,
yourString
abaixo é composto por uma letra maiúscula A com sotaque agudo, seguida pela bandeira do Reino Unido e por uma mulher negra.)Se queremos manter cada um deles como um único item em nossa matriz final, precisamos de uma matriz de grafemas , não de pontos de código.
Dividindo em grafemas
O JavaScript não tem suporte interno para isso - pelo menos ainda não. Portanto, precisamos de uma biblioteca que entenda e implemente as regras Unicode para qual combinação de pontos de código constitui um grafema. Felizmente, existe um: o divisor de grafemas de orling . Você deseja instalá-lo com o npm ou, se não estiver usando o npm, faça o download do arquivo index.js e sirva-o com uma
<script>
tag. Para esta demonstração, carrego-a no jsDelivr.grafema-divisor nos dá uma
GraphemeSplitter
classe com três métodos:splitGraphemes
,iterateGraphemes
, ecountGraphemes
. Naturalmente, queremossplitGraphemes
:E aqui estamos - uma série de três grafemas, que provavelmente é o que você queria.
fonte
Você pode percorrer o comprimento da string e pressionar o caractere em cada posição :
fonte
"😃".charAt(0)
retornará um carácter inutilizável.split("")
a opção mais rápida novamente.split("")
parece ser fortemente otimizado no firefox. Enquanto o loop tem desempenho semelhante no chrome e no firefox, a divisão é significativamente mais rápida no firefox para entradas pequenas e grandes.resposta simples:
fonte
Uma possibilidade é a seguinte:
fonte
Que tal agora?
fonte
Array.prototype.slice também fará o trabalho.
fonte