mengubah string menjadi array bilangan bulat

92

Saya ingin mengubah string berikut '14 2'menjadi array dua bilangan bulat. Bagaimana saya bisa melakukannya?

TJ
sumber

Jawaban:

88

Anda bisa .split()mendapatkan array string , lalu mengulang untuk mengubahnya menjadi angka, seperti ini:

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

Ini +myArray[i]hanyalah cara cepat untuk melakukan konversi angka, jika Anda yakin itu bilangan bulat, Anda dapat melakukannya:

for(var i=0; i<myArray.length; i++) { myArray[i] = parseInt(myArray[i], 10); } 
Nick Craver
sumber
5
lebih pendek: for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0;menggunakan konversi bitwise dan perulangan yang lebih pendek
vsync
1
atau dengan ES5:myArray.forEach(function(x,y,z){ z[y]=x|0 })
vsync
3
@vsync - tentu ... tetapi ketika ada kompilator yang akan mempersingkatnya lebih dari itu, mengapa membuatnya menyakitkan? :) Clarity bernilai beberapa byte tambahan, terutama ketika itu sebenarnya tidak akan lebih lama jika sama sekali diminimalkan.
Nick Craver
karena untuk sekali ini, saya tidak mengecilkan kode yang saya terbitkan, sehingga orang lain dapat membaca kode saya dan melihat apa yang terjadi, dan kedua, operasi bitwise jauh lebih cepat daripada parseInt.
vsync
5
@vsync - pastikan Anda menguji klaim itu di semua browser, menurut saya + lebih mudah dibaca ... dan jika Anda menguji, sebagian besar browser terbaru ada perbedaan yang dapat diabaikan, bagaimanapun juga - tergantung pada mesinnya. Selain itu, Anda dapat menawarkan .min.jsdan .jsjika Anda ingin mengekspos kode Anda ... ingat bahwa minifikasi bukan untuk ketidakjelasan (atau tidak seharusnya, karena ini tidak berguna untuk itu), ini untuk mengurangi overhead HTTP - pemuatan halaman yang lebih cepat untuk pengguna Anda.
Nick Craver
213

Yang cepat untuk peramban modern:

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

// [14, 2]`
xer0x
sumber
1
Cara yang sangat bersih! Harus top.
hazelnut
1
bola. itu luar biasa. sangat segar dan sangat bersih.
Todd
2
+1 dan cukup tambahkan polyfill untuk dukungan browser lama jika diperlukan developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
qdev
1
bagus, tapi bagaimana sebenarnya ini bekerja? Anda mengirimkan objek Number tetapi saya tidak yakin bagaimana mengubahnya. Saya pikir Anda perlu melewati fungsi untuk memetakan.
Jarg7
2
ya itu benar. Number () adalah fungsi yang diteruskan ke peta, dan ini mengubah nilai. Lihat jawaban Todd untuk lebih jelasnya.
xer0x
35

JADI ... utas lama, aku tahu, tapi ...

EDIT

@Roccousolino mendapatkan hasil yang bagus; inilah alternatifnya:

TL; DR:

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

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

Ada kekurangan halus dalam solusi yang lebih elegan yang tercantum di sini, khususnya jawaban indah @amillara dan @Marcus.

Masalahnya terjadi ketika elemen dari larik string tidak seperti integer, mungkin dalam kasus tanpa validasi pada input. Untuk contoh yang dibuat-buat ...

Masalah:


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

Karena Anda jelas menginginkan array int PURE, itu masalah. Sejujurnya , saya tidak menangkap ini sampai saya menyalin-tempel kode SO ke skrip saya ...: /


The (sedikit-sedikit-baller) fix:


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

Jadi, sekarang bahkan ketika Anda memiliki string int crap, output Anda adalah array integer murni. Yang lain benar-benar seksi dalam banyak kasus, tapi aku memang ingin menawarkan sebagian besar waktuku dengan kasar . Ini masih satu kalimat, untuk kredit saya ...

Semoga menghemat waktu seseorang!

Todd
sumber
1
Totes baller cukup untukku. Terima kasih, Todd!
indextwo
5
Hati-hati, ini tidak akan berfungsi jika string Anda berisi satu atau lebih 0. Nol terjemahkan ke boolean = false, jadi filter boolean tidak akan menyimpannya.
Rocco Musolino
1
Anda dapat mengganti .filter(Boolean)dengan.filter( (x) => !Number.isNaN(x))
Bob9630
26
var result = "14 2".split(" ").map(function(x){return parseInt(x)});
amillara
sumber
5
Tidak semua browser mendukung ini - ini akan rusak di IE, ini adalah fitur JavaScript 1.6+. Juga, saya katakan pada jawaban lain, selalu berikan radix ke parseInt().
Nick Craver
2
Saya sangat menantikan kapan kita dapat menggunakan .mapdan serupa di JS di browser apa pun tanpa pustaka tambahan.
JAL
5

Alternatif jawaban Tushar Gupta adalah:

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

// [14, 2]`

Dalam kode golf Anda menyimpan 1 karakter. Di sini operator "+" adalah "unary plus", bekerja seperti parseInt.

Yann Rolland
sumber
3

Pertama pisahkan string pada spasi:

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

Kemudian ubah larik hasil string menjadi bilangan bulat:

for (var i in result) {
    result[i] = parseInt(result[i], 10);
}
Marcus Whybrow
sumber
2
Anda harus selalu meneruskan argumen radix ke parseInt(), jika tidak, Anda mungkin mendapatkan oktal di sana.
Nick Craver
Jika senar tidak dimulai 0, atau 0xseharusnya baik-baik saja.
Marcus Whybrow
1
Jika tidak (lihat bagaimana Anda mengawali dengan asumsi?) ... mengapa menambahkan 3 karakter yang diperlukan untuk membuatnya benar untuk semua kasus tersebut juga?
Nick Craver
3

Poin melawan parseInt-approach:

Tidak perlu menggunakan lambda dan / atau memberi radixparameter ke parseInt, cukup gunakan parseFloatatau Numbersebagai gantinya.


Alasan:

  1. Bekerja:

    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. Lebih pendek.

  3. Ini sedikit lebih cepat dan memanfaatkan cache, ketika parseInt-approach - tidak :

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

Perhatian: Di Firefox parseIntbekerja sekitar 4 kali lebih cepat, tetapi masih lebih lambat dari yang lain. Total: +e< Number< parseFloat<parseInt

ankhzet.dll
sumber
0

Hanya untuk bersenang-senang, saya pikir saya juga akan memberikan forEach(f())solusi.

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

// a = [14,2]
ocodo
sumber
0
let idsArray = ids.split(',').map((x) => parseInt(x));
Ahmed Said
sumber
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa kode ini memecahkan masalah akan meningkatkan nilai jawaban jangka panjang.
Badacadabra
0

Solusi satu baris yang lebih baik:

var answerInt = [];
var answerString = "1 2 3 4";
answerString.split(' ').forEach(function (item) {
   answerInt.push(parseInt(item))
});
Ravi Gaur
sumber
Itu bukan string.
delroh
-3

kami fungsi split :

var splitresult = "14 2".split(" ");
pyvi
sumber
3
Ini mendapat array string, bukan angka.
Nick Craver
Ouups, ya, salah membaca itu. Lihat jawaban Marcus Whybrow atau Nick Craver untuk selebihnya, lalu.
pyvi