mengubah string menjadi array bilangan bulat


92

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

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

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]`

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!


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

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.


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

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


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]

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

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

Itu bukan string.
delroh

-3

kami fungsi split :

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.