web-dev-qa-db-fra.com

Comment diviser une chaîne en un tableau de caractères?

var s = "overpopulation";
var ar = [];
ar = s.split();
alert(ar);

Je veux string.split un mot dans un tableau de caractères.

Le code ci-dessus ne semble pas fonctionner - il renvoie la "surpopulation" sous la forme d'un objet.

Comment puis-je le scinder en tableau de caractères, si la chaîne d'origine ne contient pas de virgules et d'espaces?

108
DrStrangeLove

Vous pouvez diviser sur une chaîne vide:

var chars = "overpopulation".split('');

Si vous voulez juste accéder à une chaîne de façon tableau, vous pouvez le faire sans split:

var s = "overpopulation";
for (var i = 0; i < s.length; i++) {
    console.log(s.charAt(i));
}

Vous pouvez également accéder à chaque caractère avec son index en utilisant la syntaxe de tableau normale. Notez cependant que les chaînes sont immuables, ce qui signifie que vous ne pouvez pas définir la valeur d'un caractère utilisant cette méthode et qu'il n'est pas pris en charge par IE7 (si cela vous concerne toujours).

var s = "overpopulation";

console.log(s[3]); // logs 'r'
199
lonesomeday

Vieille question mais il faut que je vous prévienne:

Ne PAS utiliser .split('')

Vous obtiendrez des résultats étranges avec les jeux de caractères non-BMP (non-Basic-Multilingual-Plane).

La raison en est que des méthodes telles que .split() et .charCodeAt() ne respectent que les caractères dont le point de code est inférieur à 65536; bec. Les points de code supérieurs sont représentés par une paire de (valeur inférieure) " de substitution "pseudo-caractères.

'????????????'.length     // —> 6
'????????????'.split('')  // —> ["�", "�", "�", "�", "�", "�"]

'????'.length      // —> 2
'????'.split('')   // —> ["�", "�"]

Utilisez les fonctionnalités de ES2015 (ES6) dans la mesure du possible:

En utilisant l'opérateur spread :

let arr = [...str];

Ou Array.from

let arr = Array.from(str);

Ou split avec le nouveau drapeau u RegExp:

let arr = str.split(/(?!$)/u);

Exemples:

[...'????????????']        // —> ["????", "????", "????"]
[...'????????????']     // —> ["????", "????", "????"]

Pour ES5, les options sont limitées:

Je suis venu avec cette fonction qui utilise en interne exemple MDN pour obtenir le point de code correct de chaque caractère.

function stringToArray() {
  var i = 0,
    arr = [],
    codePoint;
  while (!isNaN(codePoint = knownCharCodeAt(str, i))) {
    arr.Push(String.fromCodePoint(codePoint));
    i++;
  }
  return arr;
}

Cela nécessite fonction knownCharCodeAt() et pour certains navigateurs; un String.fromCodePoint() polyfill.

if (!String.fromCodePoint) {
// ES6 Unicode Shims 0.1 , © 2012 Steven Levithan , MIT License
    String.fromCodePoint = function fromCodePoint () {
        var chars = [], point, offset, units, i;
        for (i = 0; i < arguments.length; ++i) {
            point = arguments[i];
            offset = point - 0x10000;
            units = point > 0xFFFF ? [0xD800 + (offset >> 10), 0xDC00 + (offset & 0x3FF)] : [point];
            chars.Push(String.fromCharCode.apply(null, units));
        }
        return chars.join("");
    }
}

Exemples:

stringToArray('????????????')     // —> ["????", "????", "????"]
stringToArray('????????????')  // —> ["????", "????", "????"]

Remarque : str[index] (ES5) et str.charAt(index) renverront également des résultats étranges avec des jeux de caractères non-BMP. par exemple. '????'.charAt(0) renvoie "�".

UPDATE: Lisez ceci Bel article sur JS et Unicode.

69
Onur Yıldırım

C'est aussi simple que:

s.split("");

Le délimiteur est une chaîne vide, il se séparera donc entre chaque caractère.

18
pimvdb

La méthode split () en javascript accepte deux paramètres: un séparateur et une limite. Le séparateur spécifie le caractère à utiliser pour fractionner la chaîne. Si vous ne spécifiez pas de séparateur, la chaîne entière est renvoyée, non séparée. Toutefois, si vous spécifiez la chaîne vide en tant que séparateur, la chaîne est divisée entre chaque caractère.

Donc:

s.split('')

aura l'effet que vous recherchez.

Plus d'informations ici

8
Diana Ionita

.split ('') diviserait les emojis en deux.

Solutions Onur et le travail proposé par regex pour certains emojis, mais ne peut pas gérer des langages plus complexes ou des emojis combinés. Considérez cet emoji en ruine:

[..."????️‍????"] // returns ["????", "️", "‍", "????"]  instead of ["????️‍????"]

Considérez également ce texte hindi "" qui est divisé comme suit:

[..."अनुच्छेद"]  // returns   ["अ", "न", "ु", "च", "्", "छ", "े", "द"]

mais devrait en fait être divisé comme ceci:

["अ","नु","च्","छे","द"]

parce que certains caractères combinent des marques (pensez diacritiques/accents dans les langues européennes).

Vous pouvez utiliser la bibliothèque grapheme-splitter pour cela:

https://github.com/orling/grapheme-splitter

La lettre est divisée en plusieurs normes dans des centaines de cas exotiques - oui, il y en a beaucoup.

5
Orlin Georgiev

Vous pouvez utiliser l'expression régulière /(?!$)/:

"overpopulation".split(/(?!$)/)

L'assertion de recherche négative (?!$) correspondra devant chaque caractère.

5
Gumbo

Une chaîne en Javascript est déjà un tableau de caractères.

Vous pouvez simplement accéder à n'importe quel caractère du tableau comme à n'importe quel autre tableau.

var s = "overpopulation";
alert(s[0]) // alerts o.

UPDATE

Comme indiqué dans les commentaires ci-dessous, la méthode ci-dessus pour accéder à un caractère dans une chaîne fait partie de ECMAScript 5, auquel certains navigateurs peuvent ne pas se conformer.

Une autre méthode que vous pouvez utiliser est charAt(index).

var s = "overpopulation";
    alert(s.charAt(0)) // alerts o.
5
Jamie Dixon

Pour soutenir les emojis, utilisez ceci

('Dragon ????').split(/(?!$)/u);

=> ['D', 'r', 'a', 'g', 'o', 'n', ' ', '????']

3
Murhaf Sousli