converter string em array de inteiros

92

Quero converter a seguinte string '14 2'em uma matriz de dois inteiros. Como eu posso fazer isso ?

TJ
fonte

Respostas:

88

Você pode .split()obter uma matriz de strings e , em seguida, fazer um loop para convertê-las em números, como este:

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

Essa +myArray[i]é apenas uma maneira rápida de fazer a conversão de número. Se você tiver certeza de que são inteiros, pode apenas fazer:

for(var i=0; i<myArray.length; i++) { myArray[i] = parseInt(myArray[i], 10); } 
Nick Craver
fonte
5
mais curto: for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0;usando a conversão bit a bit e um loop mais curto
vsync
1
ou com ES5:myArray.forEach(function(x,y,z){ z[y]=x|0 })
vsync
3
@vsync - claro ... mas quando qualquer compilador vai encurtá-lo ainda mais do que isso, por que tornar sua manutenção dolorosa? :) Clareza vale alguns bytes extras, especialmente quando não vai demorar muito mais se for minimizada.
Nick Craver
porque, pela primeira vez, não minifico meu código publicado, para que outros possam ler meu código e ver o que está acontecendo e, segundo, as operações bit a bit são muito mais rápidas do que parseInt.
vsync de
5
@vsync - certifique-se de testar essa afirmação em todos os navegadores, eu pessoalmente acho o + mais legível ... e se você testar, na maioria dos navegadores mais recentes, há uma diferença insignificante, de qualquer maneira - dependendo do mecanismo. Além disso, você pode oferecer um .min.jse .jsse quiser expor seu código ... lembre-se de que a minificação não é para obscuridade (ou não deveria ser, já que é inútil para isso), é para reduzir a sobrecarga de HTTP - um carregamento de página mais rápido para seus usuários.
Nick Craver
212

Um rápido para navegadores modernos:

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

// [14, 2]`
xer0x
fonte
1
Maneira muito limpa! Deve ser superior.
avelã
1
bolas. Fantástico. tão fresco e tão limpo.
Todd
2
+1 e apenas adicionar polyfill para suporte a navegadores mais antigos, se necessário developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
qdev
1
legal, mas como isso está realmente funcionando? Você está passando no objeto Number, mas não tenho certeza de como é convertê-lo. Achei que você precisava passar uma função para mapear.
Jarg7
2
sim, isso mesmo. Number () é a função passada para mapear e converte os valores. Confira a resposta de Todd para mais detalhes.
xer0x
35

ASSIM ... tópico mais antigo, eu sei, mas ...

EDITAR

@RoccoMusolino teve uma boa pegada; aqui está uma alternativa:

TL; DR:

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

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

Há uma falha sutil nas soluções mais elegantes listadas aqui, especificamente @amillara e @Marcus 'as respostas de outra forma lindas.

O problema ocorre quando um elemento da matriz de string não é semelhante a um inteiro, talvez em um caso sem validação em uma entrada. Para um exemplo artificial ...

O problema:


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

Já que você obviamente quer um array PURE int, isso é um problema. Honestamente , eu não entendi isso até que copiei e colei o código do SO em meu script ...: /


A correção (ligeiramente menos baller) :


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

Então, agora, mesmo quando você tem uma string int crap, sua saída é um array inteiro puro. Os outros são realmente sensuais na maioria dos casos, mas eu queria oferecer o meu na verdade vagaroso . Ainda assim, para meu crédito ...

Espero que economize o tempo de alguém!

Todd
fonte
1
Totes baller o suficiente para mim. Obrigado, Todd!
indextwo
5
Cuidado, isso não funcionará se sua string contiver um ou mais 0. Zero se traduz em boolean = false, então o filtro booleano não o manterá.
Rocco Musolino
1
você pode substituir .filter(Boolean)por.filter( (x) => !Number.isNaN(x))
Bob9630
26
var result = "14 2".split(" ").map(function(x){return parseInt(x)});
Amillara
fonte
5
Nem todos os navegadores suportam isso - vai quebrar no IE, é um recurso JavaScript 1.6+. Além disso, eu disse em outra resposta, sempre passe um radical para parseInt().
Nick Craver
2
Estou ansioso para ver quando poderemos usar .mapum JS em qualquer navegador sem bibliotecas adicionais.
JAL
5

Uma alternativa à resposta de Tushar Gupta seria:

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

// [14, 2]`

No código de golfe, você salva 1 caractere. Aqui, o "+" é o operador "mais unário", funciona como parseInt.

Yann Rolland
fonte
3

Primeiro divida a string em espaços:

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

Em seguida, converta a matriz de resultados de strings em inteiros:

for (var i in result) {
    result[i] = parseInt(result[i], 10);
}
Marcus Whybrow
fonte
2
Você deve sempre passar um argumento raiz para parseInt(), caso contrário, você pode obter octais lá.
Nick Craver
Se as cordas não começam com 0, ou 0xdeve estar bem.
Marcus Whybrow
1
Se não (veja como você prefixou isso com uma suposição?) ... por que adicionar os 3 caracteres necessários para torná-lo correto para todos esses casos também?
Nick Craver
3

O ponto contra parseInt-abordagem:

Não há necessidade de usar lambdas e / ou dar radixparâmetro para parseInt, apenas use parseFloatou no Numberlugar.


Razões:

  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. É mais curto.

  3. É um pouco mais rápido e aproveita o cache, quando parseInt-approach - não :

      // 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: No Firefox parseIntfunciona cerca de 4 vezes mais rápido, mas ainda mais lento do que outros. No total: +e< Number< parseFloat<parseInt

Ankhzet
fonte
0

Só por diversão, pensei em lançar uma forEach(f())solução também.

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

// a = [14,2]
ocodo
fonte
0
let idsArray = ids.split(',').map((x) => parseInt(x));
Ahmed disse
fonte
Embora este código possa responder à pergunta, fornecer contexto adicional sobre como e / ou por que ele resolve o problema melhoraria o valor da resposta a longo prazo.
Badacadabra
0

Melhor solução de uma linha:

var answerInt = [];
var answerString = "1 2 3 4";
answerString.split(' ').forEach(function (item) {
   answerInt.push(parseInt(item))
});
Ravi Gaur
fonte
Isso não é uma corda.
delroh
-3

nos a função de divisão :

var splitresult = "14 2".split(" ");
pyvi
fonte
3
Isso obtém uma matriz de strings, não números.
Nick Craver
Ouups, sim, interpretou mal. Veja a resposta de Marcus Whybrow ou Nick Craver para o resto, então.
pyvi