chuyển đổi chuỗi thành mảng số nguyên


92

Tôi muốn chuyển đổi chuỗi sau '14 2'thành một mảng hai số nguyên. Tôi làm nó như thế nào ?

Câu trả lời:


88

Bạn có thể .split()lấy một mảng chuỗi , sau đó lặp lại để chuyển chúng thành số, như sau:

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

Đây +myArray[i]chỉ là một cách nhanh chóng để thực hiện chuyển đổi số, nếu bạn chắc chắn rằng chúng là số nguyên, bạn chỉ có thể thực hiện:

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

5
ngắn hơn: for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0;bằng cách sử dụng chuyển đổi Bitwise và vòng lặp ngắn
vsync

1
hoặc với ES5:myArray.forEach(function(x,y,z){ z[y]=x|0 })
vsync

3
@vsync - chắc chắn ... nhưng khi bất kỳ trình biên dịch nào sẽ rút ngắn nó xuống nhiều hơn thế, tại sao lại khiến việc duy trì nó trở nên khó khăn? :) Sự rõ ràng có giá trị thêm một vài byte, đặc biệt là khi nó thực sự sẽ không lâu hơn nếu được giảm thiểu một lần.
Nick Craver

bởi vì một lần, tôi không rút gọn mã đã xuất bản của mình, vì vậy những người khác có thể đọc mã của tôi và xem điều gì đang xảy ra, và thứ hai, các thao tác bitwise nhanh hơn nhiều so với parseInt.
vsync

5
@vsync - đảm bảo bạn kiểm tra xác nhận quyền sở hữu đó trên tất cả các trình duyệt, cá nhân tôi thấy dấu + dễ đọc hơn ... và nếu bạn kiểm tra, hầu hết các trình duyệt mới nhất đều có sự khác biệt không đáng kể, tùy thuộc vào công cụ. Ngoài ra, bạn có thể cung cấp một .min.js.jsnếu bạn muốn tiết lộ mã của mình ... hãy nhớ rằng việc thu nhỏ không phải là để che khuất (hoặc không nên, vì nó vô dụng đối với điều đó), mà là để giảm chi phí HTTP - tải trang nhanh hơn cho người dùng của bạn.
Nick Craver

213

Một nhanh cho các trình duyệt hiện đại:

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

// [14, 2]`

1
Cách rất sạch sẽ! Nên đứng đầu.
hazelnut

1
những quả bóng. thật tuyệt. rất tươi và sạch.
Todd

2
+1 và chỉ thêm polyfill để hỗ trợ trình duyệt cũ hơn nếu cần developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
qdev

1
tốt, nhưng điều này thực sự hoạt động như thế nào? Bạn đang chuyển đối tượng Number nhưng tôi không chắc nó chuyển đổi nó như thế nào. Tôi nghĩ bạn cần chuyển vào một hàm để lập bản đồ.
Jarg7

2
vâng, đúng vậy. Number () là hàm được truyền tới ánh xạ và nó chuyển đổi các giá trị. Kiểm tra câu trả lời của Todd để biết thêm chi tiết.
xer0x

35

VẬY ... chủ đề cũ hơn, tôi biết, nhưng ...

BIÊN TẬP

@RoccoMusolino đã có một pha bắt bóng đẹp mắt; đây là một giải pháp thay thế:

TL; DR:

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

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

Có một lỗ hổng nhỏ trong các giải pháp thanh lịch hơn được liệt kê ở đây, cụ thể là @amillara và @Marcus 'nếu không thì các câu trả lời đẹp đẽ.

Sự cố xảy ra khi một phần tử của mảng chuỗi không giống như số nguyên, có lẽ trong trường hợp không có xác thực trên đầu vào. Đối với một ví dụ giả định ...

Vấn đề:


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

Vì bạn rõ ràng muốn có một mảng int PURE, đó là một vấn đề. Thành thật mà nói , tôi đã không hiểu điều này cho đến khi tôi sao chép mã SO vào tập lệnh của mình ...: /


Cách khắc phục (hơi-ít-baller) :


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

Vì vậy, ngay cả khi bạn có chuỗi int crap, đầu ra của bạn là một mảng số nguyên thuần túy. Những người khác đang thực sự quyến rũ trong hầu hết các trường hợp, nhưng tôi đã muốn cung cấp của tôi chủ yếu là rambly w'actually . Tuy nhiên, nó vẫn chỉ là một lớp lót, đối với tín dụng của tôi ...

Hy vọng nó tiết kiệm thời gian cho ai đó!


1
Totes baller đủ cho tôi. Cảm ơn, Todd!
hạn

5
Hãy chú ý, điều này sẽ không hoạt động nếu chuỗi của bạn chứa một hoặc nhiều hơn 0. Dịch zero thành boolean = false, vì vậy bộ lọc boolean sẽ không giữ nó.
Rocco Musolino

1
bạn có thể thay thế .filter(Boolean)với.filter( (x) => !Number.isNaN(x))
Bob9630

26
var result = "14 2".split(" ").map(function(x){return parseInt(x)});

5
Không phải tất cả các trình duyệt đều hỗ trợ tính năng này - nó sẽ bị lỗi trong IE, đây là một tính năng JavaScript 1.6+. Ngoài ra, tôi đã nói về một câu trả lời khác, luôn chuyển một cơ số cho parseInt().
Nick Craver

2
Tôi rất mong đợi khi nào chúng ta có thể sử dụng .mapvà tương tự trong JS trong bất kỳ trình duyệt nào mà không cần thư viện bổ sung.
JAL

5

Một thay thế cho câu trả lời của Tushar Gupta sẽ là:

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

// [14, 2]`

Trong mã golf bạn lưu 1 ký tự. Ở đây toán tử "+" là "cộng một bậc", hoạt động giống như parseInt.


3

Trước tiên hãy chia chuỗi trên khoảng trắng:

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

Sau đó chuyển đổi mảng kết quả của chuỗi thành số nguyên:

for (var i in result) {
    result[i] = parseInt(result[i], 10);
}

2
Bạn phải luôn chuyển đối số cơ số tới parseInt(), nếu không, bạn có thể nhận được số bát phân trong đó.
Nick Craver

Nếu các chuỗi không bắt đầu bằng 0, hoặc 0xnó sẽ ổn.
Marcus Whybrow

1
Nếu họ không (hãy xem cách bạn đặt tiền tố đó bằng một giả định?) ... tại sao lại thêm 3 ký tự cần thiết để làm cho nó chính xác cho tất cả những trường hợp đó?
Nick Craver

3

Điểm chống lại parseInt-approach:

Không cần sử dụng lambdas và / hoặc cung cấp radixtham số cho parseInt, chỉ cần sử dụng parseFloathoặc Numberthay thế.


Lý do:

  1. Nó đang hoạt động:

    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. Nó ngắn hơn.

  3. Nó nhanh hơn một chút và tận dụng 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'! >_<

Lưu ý: Trong Firefox parseInthoạt động nhanh hơn khoảng 4 lần, nhưng vẫn chậm hơn những người khác. Trong tổng số: +e< Number< parseFloat<parseInt


0

Chỉ cho vui thôi, tôi nghĩ tôi cũng sẽ đưa ra một forEach(f())giải pháp.

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

Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh về cách và / hoặc lý do tại sao nó giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Badacadabra

0

Giải pháp một dòng tốt hơn:

var answerInt = [];
var answerString = "1 2 3 4";
answerString.split(' ').forEach(function (item) {
   answerInt.push(parseInt(item))
});

Đó không phải là một chuỗi.
delroh

-3

chúng tôi chức năng phân chia :

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

3
Điều này nhận được một mảng các chuỗi, không phải số.
Nick Craver

Ouups, vâng, đã đọc nhầm. Sau đó, hãy xem câu trả lời của Marcus Whybrow hoặc Nick Craver cho phần còn lại.
pyvi,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.