Làm thế nào để chuyển đổi một chuỗi số thành một mảng số?


186

Tôi có chuỗi dưới đây -

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

khi tôi làm -

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

Tôi nhận được bnhư["1", "2", "3", "4"]

Tôi có thể làm một cái gì đó để có được bnhư [1, 2, 3, 4]?

Câu trả lời:


24

2 xu của tôi cho người chơi golf:

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

backquote là chuỗi ký tự để chúng ta có thể bỏ qua dấu ngoặc đơn (vì bản chất của hàm split) nhưng nó tương đương với split(','). Chuỗi bây giờ là một mảng, chúng ta chỉ cần ánh xạ từng giá trị với một hàm trả về số nguyên của chuỗi vì vậy x=>+x(thậm chí còn ngắn hơn Numberhàm (5 ký tự thay vì 6)) tương đương với:

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

Tôi hy vọng nó là một chút rõ ràng hơn.


Tại sao điều này làm việc như thế này? Có vẻ không thanh lịch vì nó quá trừu tượng.
Christian Matthew

Tại sao chúng ta quan tâm đến việc sử dụng bao nhiêu ký tự?
SafeFastExpressive

Lạ, ở góc 7, dấu ngoặc đơn là bắt buộc.
James LoForti

@SafeFastExpressive vì đây là phiên bản dành cho "người chơi gôn", nếu bạn không biết tôi đang nói về điều gì: codegolf.stackexchange.com
TrapII

406

Bạn có thể sử dụng Array.mapđể chuyển đổi từng yếu 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 tài liệu


Hoặc thanh lịch hơn như được chỉ ra bởi Người dùng: Jun435

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

Nơi nào Number()sẽ làm phần còn lại: kiểm tra ở đây


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

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" trong tài liệu thực sự nói về chủ đề này.
Antony

87
hoặc đơn giản map(Number).
Georgia

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 ngạc nhiên, eh?)
Joe Zack

1
Đáng lưu ý rằng Số () sẽ không bắt buộc các số nguyên, chỉ các số. Nếu bạn cần truyền cụ thể vào ints, hãy sử dụng parseInt (). "1.1,2,3".split(",").map(Number)[1.1, 2, 3]trong khi đó "1.1,2,3".split(",").map(item => parseInt(item, 10))[1, 2, 3]
dtbarne

1
@Sachith - Đối số thứ hai cho parseInt () là cơ sở. Trong trường hợp này 10. Tham chiếu: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Kẻ

18

Ánh xạ nó tới số nguyên:

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

mapxem xét mọi mục mảng, chuyển nó đến hàm được cung cấp và trả về một mảng với các giá trị trả về của hàm đó. mapkhông có sẵn trong các trình duyệt cũ, nhưng hầu hết các thư viện như jQuery hoặc gạch dưới đều có phiên bản trình duyệt chéo.

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

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

15

+stringsẽ cố gắng thay đổi chuỗi thành một số. Sau đó sử dụng Array.mapchức năng để thay đổi mọi yếu tố.

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

11

Một giải pháp ngắn hơn: ánh xạ và chuyển các đối số tới Number:

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


10

Array.from () để biết chi tiết đi đến MDN

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

b là một dãy số


2
Đây là cách đơn giản nhất mà tôi tìm thấy !!
FonzTech



3

Không cần sử dụng lambdas và / hoặc đưa ra radixtham số parseInt, chỉ cần sử dụng parseFloathoặc Numberthay vào đó.

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 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 các ứng dụng khác. Tổng cộng:+e < Number< parseFloat<parseInt


3

Cách js gạch dưới -

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

2

Phiên bản của Matt Zeunert với chức năng arraw (ES6)

const nums = a.split(',').map(x => parseInt(x, 10));

1
10 đại diện cho cái gì ??
Dinesh Kanivu

1

Vì tất cả các câu trả lời cho phép NaNđược đưa vào, tôi nghĩ tôi muốn thêm rằng nếu bạn muốn nhanh chóng truyền một loạt các giá trị hỗn hợp thành 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.

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.