Comment obtenir une chaîne de caractères dans un tableau de caractères en JavaScript?
Je pense obtenir une chaîne comme "Hello world!"
dans le tableau ['H','e','l','l','o',' ','w','o','r','l','d','!']
Remarque: Ceci n'est pas compatible Unicode.
"I????U".split('')
donne le tableau de 4 caractères["I", "�", "�", "u"]
qui peut entraîner des bugs dangereux. Voir les réponses ci-dessous pour des alternatives sûres.
Il suffit de le scinder par une chaîne vide.
var output = "Hello world!".split('');
console.log(output);
Voir le String.prototype.split()
MDN docs .
Depuis que cette question a été posée à l'origine il y a plus de cinq ans, des personnes continuent à mal exécuter ce type de tâche. Comme suggère hippietrail , réponse du médecin peut rompre les paires de substitution et interpréter de manière erronée les "caractères". Par exemple:
// DO NOT USE THIS!
> '????????????????'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]
Je suggère d'utiliser l'une des fonctionnalités ES2015 suivantes pour gérer correctement ces séquences de caractères.
> [...'????????????????']
[ '????', '????', '????', '????' ]
> Array.from('????????????????')
[ '????', '????', '????', '????' ]
u
flag> '????????????????'.split(/(?=[\s\S])/u)
[ '????', '????', '????', '????' ]
Utilisez /(?=[\s\S])/u
au lieu de /(?=.)/u
car .
ne correspond pas aux nouvelles lignes .
Si vous êtes toujours dans l'ère ES5.1 (ou si votre navigateur ne gère pas cette regex correctement - comme Edge), vous pouvez utiliser cette alternative (transpilé par Babel ):
> '????????????????'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '????', '????', '????', '????' ]
Notez que Babel essaie également de gérer correctement les substituts inégalés. Cependant, cela ne semble pas fonctionner pour les mères porteuses faibles sans égal.
function run_test(){
str=document.getElementById('nonBMP').checked ? '????_NL_????_HIGH_????_LOW_????' : '0_NL_1_HIGH_2_LOW_3';
str=str.replace('_NL_' ,document.getElementById('nl' ).checked ? '\n' : '');
str=str.replace('_HIGH_',document.getElementById('high').checked ? '????'.charAt(0) : '');
str=str.replace('_LOW_' ,document.getElementById('low' ).checked ? '????'.charAt(1) : '');
//wrap all examples into try{ eval(...) } catch {} to aloow script execution if some syntax not supported (for example in Internet Explorer)
document.getElementById("testString" ).innerText=JSON.stringify(str);
try { document.getElementById("splitEmpty" ).innerText=JSON.stringify(eval('str.split("")')); } catch(err) { }
try { document.getElementById("splitRegexDot").innerText=JSON.stringify(eval('str.split(/(?=.)/u)')); } catch(err) { }
try { document.getElementById("spread" ).innerText=JSON.stringify(eval('[...str]')); } catch(err) { }
try { document.getElementById("arrayFrom" ).innerText=JSON.stringify(eval('Array.from(str)')); } catch(err) { }
try { document.getElementById("splitRegex" ).innerText=JSON.stringify(eval('str.split(/(?=[\\s\\S])/u)')); } catch(err) { }
try { document.getElementById("splitBabel" ).innerText=JSON.stringify(eval('str.split(/(?=(?:[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]))/)')); } catch(err) { }
}
document.getElementById('runTest').onclick=run_test;
th, td {
border: 1px solid black;
padding: 4px;
}
<div><input type="checkbox" id="nonBMP" checked /><label for="nonBMP">Codepoints above U+FFFF</label></div>
<div><input type="checkbox" id="nl" checked /><label for="nl" >Newline</label></div>
<div><input type="checkbox" id="high" /><label for="high" >Unmached high surrogate</label></div>
<div><input type="checkbox" id="low" /><label for="low" >Unmached low surrogate</label></div>
<button type="button" id="runTest">Run Test!</button>
<table>
<tr><td>str=</td> <td><div id="testString"></div></td></tr>
<tr><th colspan="2">Wrong:</th></tr>
<tr><td>str.split("")</td> <td><div id="splitEmpty"></div></td></tr>
<tr><td>str.split(/(?=.)/u)</td> <td><div id="splitRegexDot"></div></td></tr>
<tr><th colspan="2">Better:</th></tr>
<tr><td>[...str]</td> <td><div id="spread"></div></td></tr>
<tr><td>Array.from(str)</td> <td><div id="arrayFrom"></div></td></tr>
<tr><td>str.split(/(?=[\s\S])/u)</td> <td><div id="splitRegex"></div></td></tr>
<tr><td>str.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/)</td><td><div id="splitBabel"></div></td></tr>
</table>
La syntaxe spread
Vous pouvez utiliser le syntaxe de propagation , un initialiseur de tableaux introduit dans norme ECMAScript 2015 (ES6) :
var arr = [...str];
Exemples
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);
Les trois premiers résultats en:
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]
Le dernier résulte en
{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}
Support du navigateur
Vérifiez le tableau de compatibilité ECMAScript ES6 .
Autres lectures
spread
est également référencé comme "splat
" (par exemple dans PHP ou Ruby ou comme "scatter
" ( par exemple dans Python ).
Démo
C'est déjà:
var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'
Ou pour une version plus ancienne compatible avec les navigateurs, utilisez:
var mystring = 'foobar';
console.log(mystring.charAt(3)); // Outputs 'b'
Vous pouvez également utiliser Array.from
.
var m = "Hello world!";
console.log(Array.from(m))
Cette méthode a été introduite dans ES6.
C'est une vieille question mais je suis tombé sur une autre solution pas encore listée.
Vous pouvez utiliser la fonction Object.assign pour obtenir le résultat souhaité:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
Pas nécessairement juste ou faux, juste une autre option.
Vous pouvez parcourir la longueur de la chaîne et appuyer sur le caractère à chaque position :
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))
réponse simple:
let str = 'this is string, length is >26';
console.log([...str]);
Que dis-tu de ça?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array Map est également une bonne option
const name = "Hello World !"
const map = Array.prototype.map
const arr = map.call(name, single => {
return `${single}`
})
console.log(arr)