Bagaimana cara mengubah string angka menjadi array angka?

188

Saya memiliki string di bawah ini -

var a = "1,2,3,4";

ketika saya melakukan -

var b = a.split(',');

Saya mendapatkan bsebagai["1", "2", "3", "4"]

Aku bisa melakukan sesuatu untuk mendapatkan bsebagai [1, 2, 3, 4]?

Ashwin
sumber

Jawaban:

25

2 sen saya untuk pegolf:

b="1,2,3,4".split`,`.map(x=>+x)

backquote adalah string litteral sehingga kita dapat menghilangkan tanda kurung (karena sifat fungsi split) tetapi setara dengan split(','). String sekarang menjadi array, kita hanya perlu memetakan setiap nilai dengan fungsi yang mengembalikan integer string sehingga x=>+x(yang bahkan lebih pendek dari Numberfungsi (5 karakter bukannya 6)) setara dengan:

function(x){return parseInt(x,10)}// version from techfoobar
(x)=>{return parseInt(x)}         // lambda are shorter and parseInt default is 10
(x)=>{return +x}                  // diff. with parseInt in SO but + is better in this case
x=>+x                             // no multiple args, just 1 function call

Saya harap ini sedikit lebih jelas.

TrapII
sumber
mengapa ini bekerja seperti ini? Tampak tidak elegan karena terlalu abstrak.
Christian Matthew
Mengapa kita peduli tentang berapa banyak karakter yang digunakan fungsi peta?
SafeFastExpressive
Aneh, dalam sudut 7 tanda kurung diperlukan.
James LoForti
@SafeFastExpressive karena ini adalah versi untuk "pegolf", jika Anda tidak tahu apa yang saya bicarakan: codegolf.stackexchange.com
TrapII
408

Anda dapat menggunakan Array.mapuntuk mengubah setiap elemen menjadi angka.

var a = "1,2,3,4";

var b = a.split(',').map(function(item) {
    return parseInt(item, 10);
});

Periksa Dokumen


Atau lebih elegan seperti yang ditunjukkan oleh Pengguna: thg435

var b = a.split(',').map(Number);

Di mana Number()akan melakukan sisanya: periksa di sini


Catatan: Untuk browser lama yang tidak mendukung map, Anda dapat menambahkan sendiri implementasi seperti:

Array.prototype.map = Array.prototype.map || function(_x) {
    for(var o=[], i=0; i<this.length; i++) { 
        o[i] = _x(this[i]); 
    }
    return o;
};
techfoobar
sumber
2
The "kasus penggunaan Tricky" dalam dokumentasi sebenarnya berbicara tentang subjek ini.
Antony
87
atau sederhana map(Number).
georg
Catatan: pastikan Anda memeriksa versi browser di tautan itu, IE8 tidak mendukung Array.map. (Mengejutkan, eh?)
Joe Zack
1
Perlu dicatat bahwa Angka () tidak akan memaksa bilangan bulat, hanya angka. Jika Anda perlu melakukan cast khusus ke ints, gunakan parseInt (). "1.1,2,3".split(",").map(Number)adalah [1.1, 2, 3]sedangkan "1.1,2,3".split(",").map(item => parseInt(item, 10))adalah[1, 2, 3]
dtbarne
1
@Sachith - Argumen kedua untuk parseInt () adalah basis. Dalam hal ini 10. Ref: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
techfoobar
18

Petakan untuk bilangan bulat:

a.split(',').map(function(i){
    return parseInt(i, 10);
})

mapmelihat setiap item array, meneruskannya ke fungsi yang disediakan dan mengembalikan array dengan nilai pengembalian fungsi itu. maptidak tersedia di browser lama, tetapi sebagian besar perpustakaan seperti jQuery atau garis bawah menyertakan versi lintas-browser.

Atau, jika Anda lebih suka loop:

var res = a.split(",");
for (var i=0; i<res.length; i++)
{
    res[i] = parseInt(res[i], 10);
}
Matt Zeunert
sumber
15

+stringakan mencoba mengubah string ke angka. Kemudian gunakan Array.mapfungsi untuk mengubah setiap elemen.

"1,2,3,4".split(',').map(function(el){ return +el;});
xdazz
sumber
13

Array.from () untuk detail pergi ke MDN

var a = "1,2,3,4";
var b = Array.from(a.split(','),Number);

b adalah array angka

Aymen
sumber
2
Ini adalah cara paling mudah yang saya temukan !!
FonzTech
11

Solusi yang lebih singkat: memetakan dan meneruskan argumen ke Number:

var a = "1,2,3,4";
var b = a.split(',');
console.log(b);
var c = b.map(Number);
console.log(c);

nicael
sumber
10

Ini sangat sederhana. Seperti:

["1", "2", "3", "4"].map(i=>Number(i))
Q10Viking
sumber
3

Sebagai varian, Anda dapat menggunakan kombinasi _.mapdan _.arymetode dari perpustakaan lodash . Transformasi menyeluruh akan menjadi lebih kompak. Berikut ini contoh dari dokumentasi resmi :

_.map(['6', '8', '10'], _.ary(parseInt, 1));
// → [6, 8, 10]
Alexander Myshov
sumber
3

Tidak perlu menggunakan lambdas dan / atau memberikan radixparameter 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'! >_<

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

ankhzet
sumber
3

Cara garis bawah -

var a = "1,2,3,4",
  b = a.split(',');

//remove falsy/empty values from array after split
b = _.compact(b);
//then Convert array of string values into Integer
b = _.map(b, Number);

console.log('Log String to Int conversion @b =', b);
Mohan Dere
sumber
3

Versi Matt Zeunert dengan fungsi penggunaan arraw (ES6)

const nums = a.split(',').map(x => parseInt(x, 10));
FreeClimb
sumber
1
untuk apa 10 mewakili ??
Dinesh Kanivu
3

Satu liner

Array.from(a.split(','), Number)
Praveen Kishor
sumber
1

Karena semua jawaban memungkinkan NaNuntuk dimasukkan, saya pikir saya akan menambahkan bahwa jika Anda ingin dengan cepat melemparkan array nilai campuran ke angka yang dapat Anda lakukan.

var a = "1,2,3,4,foo,bar";

var b = a.split(',');

var result = b.map(_=>_|0) // Floors the number (32-bit signed integer) so this wont work if you need all 64 bits.

// or b.map(_=>_||0) if you know your array is just numbers but may include NaN.
pengguna7986267
sumber