¿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]?

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.


¿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;
};

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);
}

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;});

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


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);


10

Esto es muy simple, como:

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


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


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);

3

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

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

1
¿para qué representan 10?
Dinesh Kanivu


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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.