¿Cómo convertir una cadena de números en una matriz de números?

188

Tengo debajo de la cadena -

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

Cuando lo hago -

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

Me pongo bcomo["1", "2", "3", "4"]

puedo hacer algo para conseguir bque [1, 2, 3, 4]?

Ashwin
fuente

Respuestas:

25

Mis 2 centavos para golfistas:

b="1,2,3,4".split`,`.map(x=>+x)

la comilla posterior es literal de cadena, por lo que podemos omitir el paréntesis (debido a la naturaleza de la función dividida) pero es equivalente a split(','). La cadena ahora es una matriz, solo tenemos que asignar cada valor con una función que devuelva el entero de la cadena, por lo x=>+xque (que es incluso más corta que la Numberfunción (5 caracteres en lugar de 6)) es equivalente a:

function(x){return parseInt(x,10)}// version from techfoobar
(x)=>{return parseInt(x)}         // lambda are shorter and parseInt default is 10
(x)=>{return +x}                  // diff. with parseInt in SO but + is better in this case
x=>+x                             // no multiple args, just 1 function call

Espero que sea un poco más claro.

TrapII
fuente
¿Por qué esto funciona así? Parece no elegante porque es demasiado abstracto.
Christian Matthew
¿Por qué nos importaría cuántos caracteres utiliza la función de mapa?
SafeFastExpressive
Extraño, en angular 7 se requieren los paréntesis.
James LoForti
@SafeFastExpressive porque esta es una versión para "golfistas", si no sabes de lo que estoy hablando: codegolf.stackexchange.com
TrapII
408

Puede usar Array.mappara convertir cada elemento en un número.

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

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

Revisa los documentos


O más elegantemente como lo señaló el Usuario: thg435

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

Dónde Number()haría el resto: verifique aquí


Nota: Para los navegadores más antiguos que no son compatibles map, puede agregar una implementación usted mismo como:

Array.prototype.map = Array.prototype.map || function(_x) {
    for(var o=[], i=0; i<this.length; i++) { 
        o[i] = _x(this[i]); 
    }
    return o;
};
techfoobar
fuente
2
El "caso de uso complicado" en la documentación realmente habla sobre este tema.
Antony
87
o simplemente map(Number).
georg
Nota: asegúrese de verificar la versión del navegador en ese enlace, IE8 no es compatible con Array.map. (Sorprendente, ¿eh?)
Joe Zack
1
Vale la pena señalar que Number () no forzará números enteros, solo números. Si necesita convertir específicamente a ints, use parseInt (). "1.1,2,3".split(",").map(Number)es [1.1, 2, 3]mientras que "1.1,2,3".split(",").map(item => parseInt(item, 10))es[1, 2, 3]
dtbarne
1
@Sachith: el segundo argumento para parseInt () es la base. En este caso 10. Ref: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
techfoobar
18

Asignarlo a enteros:

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

mapmira cada elemento de la matriz, lo pasa a la función proporcionada y devuelve una matriz con los valores de retorno de esa función. mapno está disponible en los navegadores antiguos, pero la mayoría de las bibliotecas como jQuery o subrayado incluyen una versión de navegador cruzado.

O, si prefieres bucles:

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

+stringintentará cambiar la cadena a un número. Luego use la Array.mapfunción para cambiar cada elemento.

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

Array.from () para más detalles vaya a MDN

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

b es una serie de números

Aymen
fuente
2
¡Esta es la forma más directa que encontré!
FonzTech
11

Una solución más corta: mapear y pasar los argumentos a Number:

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

nicael
fuente
10

Esto es muy simple, como:

["1", "2", "3", "4"].map(i=>Number(i))
Q10Viking
fuente
3

Como variante, puede usar combiantion _.mapy _.arymétodos de la biblioteca lodash . Toda la transformación será más compacta. Aquí hay un ejemplo de la documentación oficial :

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

No hay necesidad de usar lambdas y / o dar radixparámetros a parseInt, solo use parseFloato en su Numberlugar.

Razones:

  1. Esta funcionando:

    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. Es mas corto.

  3. Es un poco más rápido y aprovecha la memoria caché, cuando el parseIntenfoque no lo hace :

      // 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'! >_<

Aviso: en Firefox parseIntfunciona aproximadamente 4 veces más rápido, pero aún más lento que otros. En total: +e< Number< parseFloat<parseInt

ankhzet
fuente
3

El subrayado js way -

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);
Mohan Dere
fuente
3

La versión de Matt Zeunert con la función use arraw (ES6)

const nums = a.split(',').map(x => parseInt(x, 10));
FreeClimb
fuente
1
¿para qué representan 10?
Dinesh Kanivu
3

Un trazador de líneas

Array.from(a.split(','), Number)
Praveen Kishor
fuente
1

Dado que todas las respuestas permiten NaNser incluidas, pensé agregar que si desea convertir rápidamente una matriz de valores mixtos en números, puede hacerlo.

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.
usuario7986267
fuente