Convertit la chaîne en un ensemble d'entiers

Je veux convertir la chaîne suivante '14 2' en un tableau de deux nombres entiers. Comment puis-je le faire ?

Vous pouvez .split() pour obtenir un ensemble de chaînes , puis passer à travers pour les convertir en nombres, comme ceci:

 var myArray = "14 2".split(" "); for(var i=0; i<myArray.length; i++) { myArray[i] = +myArray[i]; } //use myArray, it's an array of numbers 

Le +myArray[i] est juste un moyen rapide de faire la conversion du numéro, si vous êtes sûr qu'ils sont des nombres entiers que vous pouvez simplement faire:

 for(var i=0; i<myArray.length; i++) { myArray[i] = parseInt(myArray[i], 10); } 

Un rapide pour les navigateurs modernes:

 '14 2'.split(' ').map(Number); // [14, 2]` 

SO … thread plus vieux, je sais, mais …

TL; DR : "5 6 note this foo".split(" ").map(Number).filter(Boolean); // [5, 6] "5 6 note this foo".split(" ").map(Number).filter(Boolean); // [5, 6]

Il existe un défaut subtil dans les solutions plus élégantes listées ici, en particulier @amillara et @Marcus 'sinon de belles réponses.

Le problème se produit lorsqu'un élément de la chaîne de caractères n'est pas entier, peut-être dans un cas sans validation sur une entrée. Pour un exemple inventé …

Le problème:


 var effedIntArray = "5 6 7 69 foo".split(' ').map(Number); // [5, 6, 7, 69, NaN] 

Comme vous voulez évidemment un tableau PURE int, c'est un problème. Honnêtement , je n'ai pas attrapé ça jusqu'à ce que je copie le code SO dans mon script …: /

La correction (légèrement moins baller) :


 var intArray = "5 6 7 69 foo".split(" ").map(Number).filter(Boolean); // [5, 6, 7, 69] 

Donc, maintenant, même si vous avez une chaîne d'intrusion, votre sortie est un ensemble entier pur. Les autres sont vraiment sexy dans la plupart des cas, mais je voulais offrir ma plupart du temps en toute sécurité . C'est pourtant toujours un one-liner, à mon crédit …

J'espère que cela sauve du temps!

 var result = "14 2".split(" ").map(function(x){return parseInt(x)}); 

Découpez d'abord la chaîne sur les espaces:

 var result = '14 2'.split(' '); 

Ensuite, convertir le tableau de résultat des chaînes en entiers:

 for (var i in result) { result[i] = parseInt(result[i], 10); } 

Le point contre l' parseInt :

Il n'est pas nécessaire d'utiliser lambdas et / ou de donner un paramètre radix à parseInt , il suffit d'utiliser parseFloat ou Number place.


Les raisons:

  1. Ça marche:

     var src = "1,2,5,4,3"; var ids = src.split(',').map(parseFloat); // [1, 2, 5, 4, 3] var obj = {1: ..., 3: ..., 4: ..., 7: ...}; var keys= Object.keys(obj); // ["1", "3", "4", "7"] var ids = keys.map(parseFloat); // [1, 3, 4, 7] var arr = ["1", 5, "7", 11]; var ints= arr.map(parseFloat); // [1, 5, 7, 11] ints[1] === "5" // false ints[1] === 5 // true ints[2] === "7" // false ints[2] === 7 // true 
  2. C'est plus court.

  3. C'est un peu plus rapide et profite du cache, lorsque parseInt – does not :

      // execution time measure function // keep it simple, yeah? > var f = (function (arr, c, n, m) { var i,t,m,s=n(); for(i=0;i++<c;)t=arr.map(m); return n()-s }).bind(null, "2,4,6,8,0,9,7,5,3,1".split(','), 1000000, Date.now); > f(Number) // first launch, just warming-up cache > 3971 // nice =) > f(Number) > 3964 // still the same > f(function(e){return+e}) > 5132 // yup, just little bit slower > f(function(e){return+e}) > 5112 // second run... and ok. > f(parseFloat) > 3727 // little bit quicker than .map(Number) > f(parseFloat) > 3737 // all ok > f(function(e){return parseInt(e,10)}) > 21852 // awww, how adorable... > f(function(e){return parseInt(e)}) > 22928 // maybe, without '10'?.. nope. > f(function(e){return parseInt(e)}) > 22769 // second run... and nothing changes. > f(Number) > 3873 // and again > f(parseFloat) > 3583 // and again > f(function(e){return+e}) > 4967 // and again > f(function(e){return parseInt(e,10)}) > 21649 // dammit 'parseInt'! >_< 

Remarque: Dans Firefox, parseInt fonctionne environ 4 fois plus vite, mais encore plus lent que d'autres. Au total: +e < Number < parseFloat < parseInt

Juste pour l'amusement, je pensais que je forEach(f()) une forEach(f()) .

 var a=[]; "14 2".split(" ").forEach(function(e){a.push(parseInt(e,10))}); // a = [14,2] 

Une alternative à la réponse de Tushar Gupta serait:

 '14 2'.split(' ').map(x=>+x); // [14, 2]` 

Dans le code golf, vous économisez 1 caractère. Ici, l'opérateur "+" est "unary plus", fonctionne comme parseInt.

 let idsArray = ids.split(',').map((x) => parseInt(x)); 

Nous la fonction split :

 var splitresult = "14 2".split(" ");