web-dev-qa-db-fra.com

Comment convertir une chaîne de nombres en un tableau de nombres?

J'ai en dessous de la corde -

var a = "1,2,3,4";

quand je fais -

var b = a.split(',');

Je reçois b comme ["1", "2", "3", "4"]

puis-je faire quelque chose pour obtenir b comme [1, 2, 3, 4]?

125
Ashwin

Vous pouvez utiliser Array.map pour convertir chaque élément en nombre.

var a = "1,2,3,4";

var b = a.split(',').map(function(item) {
    return parseInt(item, 10);
});

Vérifiez la Docs


Ou plus élégamment comme indiqué par l'utilisateur: thg435

var b = a.split(',').map(Number);

Number() ferait le reste: vérifiez ici


Remarque: Pour les anciens navigateurs qui ne prennent pas en charge map, vous pouvez ajouter vous-même une implémentation telle que

Array.prototype.map = Array.prototype.map || function(_x) {
    for(var o=[], i=0; i<this.length; i++) { 
        o[i] = _x(this[i]); 
    }
    return o;
};
305
techfoobar

Mappez-le sur des entiers:

a.split(',').map(function(i){
    return parseInt(i, 10);
})

map regarde chaque élément du tableau, le passe à la fonction fournie et renvoie un tableau avec les valeurs de retour de cette fonction. map n'est pas disponible dans les anciens navigateurs, mais la plupart des bibliothèques comme jQuery ou underscore incluent une version multi-navigateurs.

Ou, si vous préférez les boucles:

var res = a.split(",");
for (var i=0; i<res.length; i++)
{
    res[i] = parseInt(res[i], 10);
}
16
Matt Zeunert

+string va essayer de changer la chaîne en un nombre. Puis utilisez la fonction Array.map pour changer chaque élément.

"1,2,3,4".split(',').map(function(el){ return +el;});
15
xdazz

Une solution plus courte: mappez et passez les arguments à Number:

var a = "1,2,3,4";
var b = a.split(',');
console.log(b);
var c = b.map(Number);
console.log(c);

7
nicael

En variante, vous pouvez utiliser les méthodes combiantion _.map et _.ary de la bibliothèque lodash . Toute la transformation sera plus compacte. Voici un exemple tiré de documentation officielle :

_.map(['6', '8', '10'], _.ary(parseInt, 1));
// → [6, 8, 10]
3
Alexander Myshov

Version de Matt Zeunert avec utilisation de la fonction arraw (ES6)

const nums = a.split(',').map(x => parseInt(x, 10));
2
FreeClimb

Il n'est pas nécessaire d'utiliser lambdas et/ou d'attribuer le paramètre radix à parseInt, utilisez plutôt parseFloat ou Number à la 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 tire parti du cache, lorsque parseInt- approche - n’a pas:

      // 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 reste plus lent que d’autres. Au total: +e <Number <parseFloat <parseInt

2
ankhzet

Le soulignement js façon - 

var a = "1,2,3,4",
  b = a.split(',');

//remove falsy/empty values from array after split
b = _.compact(b);
//then Convert array of string values into Integer
b = _.map(b, Number);

console.log('Log String to Int conversion @b =', b);
2
Mohan Dere

Comme toutes les réponses permettent d'inclure NaN, j'ai pensé ajouter que si vous voulez convertir rapidement un tableau de valeurs mélangées en nombres, vous pouvez le faire.

var a = "1,2,3,4,foo,bar";

var b = a.split(',');

var result = b.map(_=>_|0) // Floors the number (32-bit signed integer) so this wont work if you need all 64 bits.

// or b.map(_=>_||0) if you know your array is just numbers but may include NaN.
0
user7986267

Array.from () pour plus de détails, allez à MDN

var a = "1,2,3,4";
var b = Array.from(a.split(','),Number);

b est un tableau de nombres

0
Aymen