2010-12-14 69 views
38

Tôi nhận được một mảng sau một số thao tác. Tôi cần phải chuyển đổi tất cả các giá trị mảng thành số nguyên.Làm thế nào để chuyển đổi tất cả các phần tử trong một mảng thành số nguyên trong JavaScript?

mẫu mã của tôi

var result_string='a,b,c,d|1,2,3,4'; 
    result=result_string.split("|"); 
    alpha=result[0]; 
    count=result[1]; 
    //alert(alpha); 
    //alert(count); 
    count_array=count.split(","); 

count_array bây giờ chứa 1,2,3,4 nhưng tôi cần những giá trị được trong số nguyên.

Tôi đã sử dụng parseInt(count_array); nhưng không thành công. JS xem xét từng giá trị trong mảng này dưới dạng chuỗi.

Trả lời

17

Bạn cần phải lặp qua và phân tích/chuyển đổi các yếu tố trong mảng của bạn, như thế này:

var result_string = 'a,b,c,d|1,2,3,4', 
    result = result_string.split("|"), 
    alpha = result[0], 
    count = result[1], 
    count_array = count.split(","); 
for(var i=0; i<count_array.length;i++) count_array[i] = +count_array[i]; 
//now count_array contains numbers 

You can test it out here. Nếu +, được ném, nghĩ về nó như:

for(var i=0; i<count_array.length;i++) count_array[i] = parseInt(count_array[i], 10); 
+3

Trên thực tế, 'parseInt ("8foo", 10)' Trả về '8' khi' + "8foo" 'lợi nhuận 'NaN' . Cách tiếp cận của bạn thực sự nghiêm ngặt hơn với số không hợp lệ, tôi thích nó. –

+1

Tôi cũng có thể đề xuất sử dụng một cái gì đó như '" 74 ">> 0', một chút dịch chuyển phải bằng 0. Công việc có tốt, nghiêm ngặt và hiệu quả hơn nhiều so với các giải pháp thay thế. Tùy chọn hiệu quả thứ hai tốt nhất là thực hiện thao tác "không phải": '~~" 74 "' –

+0

@RubenMartinezJr. Nó không phải là nghiêm ngặt bởi vì '" Không phải là một số ">> 0 == 0' – Kian

7

Chỉ cần lặp mảng và chuyển đổi mục:

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

Đừng quên đối số thứ hai cho parseInt.

78

ECMAScript5 cung cấp phương thức map cho Array s, áp dụng hàm cho tất cả các phần tử của mảng. Dưới đây là một ví dụ:

var a = ['1','2','3']; 
var result = a.map(function (x) { 
    return parseInt(x, 10); 
}); 

Để biết thêm thông tin, hãy https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map

+0

Một giải pháp sạch. Cảm ơn bạn! – eduludi

+5

Đối với các vấn đề tương thích, xin lưu ý rằng phương thức Array.map() không có sẵn trong IE8 và bên dưới –

1

Sử dụng jQuery, bạn có thể thích map() method như vậy;

$.map(arr, function(val,i) { 
    return parseInt(val); 
}); 
50

Bạn có thể làm

var arrayOfNumbers = arrayOfStrings.map(Number); 

Đối với các trình duyệt cũ không hỗ trợ Array.map, bạn có thể sử dụng Underscore

var arrayOfNumbers = _.map(arrayOfStrings, Number); 
+1

Rất đẹp. Nếu bạn sử dụng dấu gạch dưới (đối với các trình duyệt cũ không hỗ trợ Array.map), bạn có thể làm 'var newArray = _.map (oldArray, Number);' – rilwis

6

Vấn đề chống parseInt -approach:

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

2

var arr = ["1", "2", "3"]; 
 
arr = arr.map(Number); 
 
console.log(arr); // [1, 2, 3]

+0

Đây là câu trả lời đúng, nhưng về cơ bản không khác gì câu trả lời khác cho câu hỏi này đã có 47 upvotes. Hơn nữa, câu trả lời sẽ hữu ích hơn nhiều nếu chúng bao gồm giải thích về mã số nhằm mục đích làm gì và tại sao giải quyết vấn đề đó mà không giới thiệu người khác. –

+0

@TomAranda Rất tiếc, đây là bài trả lời đầu tiên của tôi, vì vậy tôi có thể hơi quá háo hức để bỏ ra 2 xu. Nên đọc kỹ tất cả các câu trả lời trước khi gửi câu trả lời của riêng tôi. Cảm ơn vì bạn đã phản hồi! Tôi sẽ ghi nhớ điều đó. – chzwzrd

Các vấn đề liên quan