2010-11-27 21 views

Respuesta

77

Puede .split() para obtener una matriz de cadenas, a continuación, recorrer a convertirlos en números, así:

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 

El +myArray[i] es sólo una forma rápida de hacer la conversión de números, si está seguro de que son enteros, puede hacerlo:

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

short: 'for (var i = myArray.length; i--;) myArray [i] = myArray [i] | 0;' utilizando la conversión bit a bit y el bucle más corto – vsync

+0

o con ES5: 'myArray.forEach (function (x, y, z) {z [y] = x | 0}) ' – vsync

+3

@vsync - seguro ... pero cuando cualquier compilador va a acortarlo aún más que eso, ¿por qué hacer que mantenerlo sea doloroso?:) La claridad vale unos pocos bytes adicionales, especialmente cuando en realidad no será mucho más larga si se reduce al mínimo una vez. –

-3

nosotros el split function:

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

Esto consigue una matriz de cadenas, no números. –

+0

Ouups, sí, leyeron mal eso. Vea la respuesta de Marcus Whybrow o Nick Craver para el resto, entonces. – pyvi

3

En primer lugar dividir la cadena de espacios:

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

luego convertir la matriz resultado de cadenas en números enteros:

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

Siempre debe pasar un argumento radix a 'parseInt()', de lo contrario, puede obtener octals allí. –

+0

Si las cadenas no comienzan con '0', o' 0x', debería estar bien. –

+1

** Si ** no lo hacen (¿ves cómo prefijiste eso con una suposición?) ... ¿por qué agregar los 3 caracteres necesarios para hacerlo correcto en todos esos casos también? –

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

No todos los navegadores admiten esto - se romperá en IE, esta es una función de JavaScript 1.6+. Además, dije en otra respuesta, siempre pase una raíz a 'parseInt()'. –

+1

Espero con ansias cuando podemos usar '.map' y similar en JS en cualquier navegador sin bibliotecas adicionales. – JAL

+0

si jQuery está disponible, consulte [$ .map] (http://api.jquery.com/jquery.map/) – JoshuaDavid

0

Sólo por diversión que pensé en tirar una solución forEach(f()) en también.

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

// a = [14,2] 
174

uno rápido para navegadores modernos:

'14 2'.split(' ').map(Number); 

// [14, 2]` 
+0

mucho mejor que las otras respuestas, gracias –

+1

¡Manera muy limpia! Debería ser superior. – hazelnut

+1

bolas. Eso es genial. tan fresco y tan limpio. – Todd

33

SO ... hilo mayores, lo sé, pero ...

EDITAR

@RoccoMusolino tenía una buena atrapada; aquí está una alternativa:

TL; DR:

const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))] 

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

Hay un defecto sutil en las soluciones más elegantes enumerados aquí, específicamente @amillara y @Marcus 'por lo demás hermosas respuestas.

El problema se produce cuando un elemento de la matriz de cadenas no es como un entero, tal vez en un caso sin validación en una entrada. Para un ejemplo artificioso ...

El problema:


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

Puesto que usted desea obviamente una matriz int PURE, eso es un problema. Honestamente, no capté esto hasta que copie el código SO en mi script ...:/


El(ligeramente menos Baller)solución:


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

Así que, ahora, incluso cuando se tiene cadena int basura, su salida es una pura matriz de enteros Los otros son realmente sexys en la mayoría de los casos, pero yo realmente quería ofrecer mi rambla w'actualmente. Sin embargo, todavía es un trazador de líneas, a mi crédito ...

¡Espero que le ahorre tiempo a alguien!

+1

Totes baller suficiente para mí. Gracias, Todd! – indextwo

+4

Tenga cuidado, esto no funcionará si su cadena contiene uno o más 0. Cero traduce a booleano = falso, por lo que el filtro booleano no lo conservará. –

+0

@RoccoMusolino ¡agradable! editado – Todd

3

El punto en contra parseInt -enfoque:

No hay necesidad de usar lambdas y/o dar radix parámetro para parseInt, sólo tiene que utilizar parseFloat o Number lugar.


Razones:

  1. Está 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 más corto.

  3. Es una pequeña mas deprisa y poco se aprovecha de caché, cuando parseInt -enfoque - No:

    // 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 parseInt trabaja aproximadamente 4 veces más rápido, pero aún más lento que otros. En total: +e < Number < parseFloat < parseInt

2

Una alternativa a la respuesta Tushar Gupta sería:

'14 2'.split(' ').map(x=>+x); 

// [14, 2]` 

en campo de código que guardar el 1 carácter. Aquí el operador "+" es "unario más", funciona como parseInt.

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

Si bien este código puede responder a la pregunta, proporciona información adicional el contexto sobre cómo y/o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta. – Badacadabra

0

mejor solución de una línea:

var answerInt = []; 
var answerString = "1 2 3 4"; 
answerString.split(' ').forEach(function (item) { 
    answerInt.push(parseInt(item)) 
}); 
+0

Eso no es una cadena. – delroh

+0

@delroh Yep cambiado, gracias –

Cuestiones relacionadas