2013-03-28 47 views

Trả lời

238

Bạn có thể sử dụng Array.map để chuyển đổi từng phần tử thành một số.

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

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

Kiểm tra Docs


Hoặc thanh lịch hơn khi chỉ ra bởi người: thg435

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

đâu Number() sẽ làm phần còn lại: kiểm tra here


Lưu ý: Đối với các trình duyệt cũ không hỗ trợ map, bạn có thể thêm một thực hiện chính mình thích:

Array.prototype.map = Array.prototype.map || function(_x) { 
    for(var o=[], i=0; i<this.length; i++) { 
     o[i] = _x(this[i]); 
    } 
    return o; 
}; 
+2

Các [ "trường hợp sử dụng Tricky"] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map#Tricky_use_case) trong tài liệu thực sự các cuộc đàm phán về vấn đề này môn học. – Antony

+48

hoặc đơn giản là 'bản đồ (Số)'. – georg

+0

Lưu ý: đảm bảo bạn kiểm tra phiên bản trình duyệt trong liên kết đó, IE8 không hỗ trợ Array.map. (Ngạc nhiên, eh?) –

12

+string sẽ cố gắng thay đổi chuỗi thành một số. Sau đó sử dụng chức năng Array.map để thay đổi mọi phần tử.

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

+1 - '+ el' là sang trọng. – techfoobar

16

Bản đồ nó để số nguyên:

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

map nhìn vào tất cả các mục mảng, vượt qua nó để chức năng cung cấp và trả về một mảng với các giá trị trả về của hàm đó. map không khả dụng trong các trình duyệt cũ, nhưng hầu hết các thư viện như jQuery hoặc underscore bao gồm phiên bản trình duyệt chéo.

Hoặc, nếu bạn thích vòng:

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

+1 để chỉ ra bản đồ không khả dụng cho tất cả các trình duyệt. –

3

Là một biến thể bạn có thể sử dụng combiantion _.map_.ary phương pháp từ lodash library. Chuyển đổi toàn bộ sẽ nhỏ gọn hơn. Dưới đây là ví dụ từ official documentation:

_.map(['6', '8', '10'], _.ary(parseInt, 1)); 
// → [6, 8, 10] 
0

Không có nhu cầu sử dụng lambdas và/hoặc cung cấp cho radix tham số để parseInt, chỉ cần sử dụng parseFloat hoặc Number để thay thế.

Lý do:

  1. Nó làm việc:

    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. Đó là ngắn hơn.

  3. Đó là một chút quickier nhỏ và mất lợi thế của bộ nhớ cache, khi parseInt -approach - không:

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

Chú ý: Trong Firefox parseInt làm việc khoảng 4 lần nhanh hơn, nhưng vẫn còn chậm hơn những người khác. Trong tổng số: +e < Number < parseFloat < parseInt

6

Một giải pháp ngắn hơn: bản đồ và vượt qua các đối số Number:

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

2

Các gạch js cách -

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

Vì tất cả các câu trả lời cho phép NaN để được bao gồm, tôi nghĩ rằng tôi muốn thêm rằng nếu bạn muốn nhanh chóng đúc một mảng các giá trị hỗn hợp đến các số bạn có thể làm.

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. 
Các vấn đề liên quan