converte la stringa in un array di numeri interi


92

Voglio convertire la seguente stringa '14 2'in un array di due numeri interi. Come posso farlo ?

Risposte:


88

Puoi .split()ottenere un array di stringhe , quindi eseguire il loop per convertirle in numeri, in questo modo:

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

Il +myArray[i]è solo un modo rapido per fare la conversione da numero, se sei sicuro che siano numeri interi si può semplicemente fare:

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

5
più breve: for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0;utilizzando la conversione bit per bit e il ciclo più breve
vsync

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

3
@vsync - certo ... ma quando un compilatore lo accorcia ancora di più, perché renderlo doloroso mantenerlo? :) La chiarezza vale qualche byte in più, specialmente quando in realtà non sarà molto più lungo se non del tutto una volta minimizzato.
Nick Craver

perché per una volta non minimizzo il mio codice pubblicato, così gli altri possono leggere il mio codice e vedere cosa sta succedendo, e in secondo luogo, le operazioni bit per bit sono molto più veloci di parseInt.
vsync

5
@vsync - assicurati di testare tale affermazione su tutti i browser, personalmente trovo che il + sia più leggibile ... e se provi, la maggior parte dei browser più recenti c'è una differenza trascurabile, in entrambi i casi, a seconda del motore. Inoltre, puoi offrire un .min.jse .jsse vuoi esporre il tuo codice ... ricorda che la minificazione non è per l'oscurità (o non dovrebbe esserlo, poiché è inutile per questo), ma per ridurre il sovraccarico HTTP: un caricamento della pagina più veloce per i tuoi utenti.
Nick Craver

213

Uno veloce per i browser moderni:

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

// [14, 2]`

1
Modo molto pulito! Dovrebbe essere il migliore.
nocciola

1
palle. è fantastico. così fresco e così pulito.
Todd

2
+1 e aggiungi solo polyfill per il supporto del browser precedente, se necessario developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
qdev

1
bello, ma come funziona effettivamente? Stai passando l'oggetto Number ma non sono sicuro di come convertirlo. Pensavo avessi bisogno di passare una funzione da mappare.
Jarg7

2
sì, è vero. Number () è la funzione passata a map e converte i valori. Controlla la risposta di Todd per maggiori dettagli.
xer0x

35

Quindi ... thread più vecchio, lo so, ma ...

MODIFICARE

@RoccoMusolino ha avuto una bella cattura; ecco un'alternativa:

TL; DR:

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

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

C'è un sottile difetto nelle soluzioni più eleganti elencate qui, in particolare le risposte altrimenti belle di @amillara e @Marcus.

Il problema si verifica quando un elemento della matrice di stringhe non è simile a un numero intero, forse in un caso senza convalida su un input. Per un esempio artificioso ...

Il problema:


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

Dato che ovviamente vuoi un array int PURE, questo è un problema. Onestamente , non l'ho capito finché non ho copiato il codice SO nel mio script ...: /


La correzione (leggermente meno ballerina) :


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

Quindi, ora anche quando hai crap int string, il tuo output è un array intero puro. Gli altri sono davvero sexy nella maggior parte dei casi, ma volevo offrire il mio modo per lo più sconclusionato in realtà . Tuttavia è ancora una battuta, a mio merito ...

Spero che faccia risparmiare tempo a qualcuno!


1
Totes abbastanza baller per me. Grazie, Todd!
indextwo

5
Attenzione, questo non funzionerà se la tua stringa contiene uno o più 0. Zero si traduce in un booleano = false, quindi il filtro booleano non lo manterrà.
Rocco Musolino

1
puoi sostituire .filter(Boolean)con.filter( (x) => !Number.isNaN(x))
Bob9630

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

5
Non tutti i browser lo supportano: si romperà in IE, questa è una funzione JavaScript 1.6+. Inoltre, ho detto in un'altra risposta, passa sempre una radice a parseInt().
Nick Craver

2
Non vedo l'ora di quando possiamo usare .mape simili in JS in qualsiasi browser senza librerie aggiuntive.
JAL

5

Un'alternativa alla risposta di Tushar Gupta sarebbe:

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

// [14, 2]`

In code golf salvi 1 carattere. Qui il "+" è l'operatore "più unario", funziona come parseInt.


3

Prima dividi la stringa sugli spazi:

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

Quindi converti l'array di stringhe dei risultati in numeri interi:

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

2
Dovresti sempre passare un argomento radice a parseInt(), altrimenti potresti ottenere ottali lì dentro.
Nick Craver

Se le stringhe non iniziano con 0, o 0xdovrebbe andare bene.
Marcus Whybrow

1
Se non lo fanno (vedi come l'hai prefissato con un'ipotesi?) ... perché aggiungere i 3 caratteri necessari per renderlo corretto anche per tutti quei casi?
Nick Craver

3

Il punto contro l' parseIntapproccio:

Non è necessario utilizzare lambda e / o fornire radixparametri parseInt, basta usare parseFloato Numberinvece.


Motivi:

  1. Sta funzionando:

    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. È più corto.

  3. È un po 'più veloce e sfrutta la cache, quando parseInt-approach - non :

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

Avviso: in Firefox parseIntfunziona circa 4 volte più velocemente, ma comunque più lento di altri. In totale: +e< Number< parseFloat<parseInt


0

Solo per divertimento ho pensato di aggiungere anche una forEach(f())soluzione.

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

// a = [14,2]

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

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo su come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Badacadabra

0

Migliore soluzione a una linea:

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

Non è una stringa.
delroh

-3

us la funzione split :

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

3
Ottiene un array di stringhe, non numeri.
Nick Craver

Ouups, sì, l'ho letto male. Vedi la risposta di Marcus Whybrow o Nick Craver per il resto, allora.
pyvi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.