Câu trả lời:
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 Number
hà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.
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;
};
map(Number)
.
"1.1,2,3".split(",").map(Number)
là [1.1, 2, 3]
trong khi đó "1.1,2,3".split(",").map(item => parseInt(item, 10))
là[1, 2, 3]
Ánh xạ nó tới số nguyên:
a.split(',').map(function(i){
return parseInt(i, 10);
})
map
xem 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 đó. map
khô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);
}
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);
Là một biến thể, bạn có thể sử dụng kết hợp _.map
và _.ary
phương thức từ thư viện lodash . Chuyển đổi toàn bộ sẽ nhỏ gọn hơn. Dưới đây là ví dụ từ tài liệu chính thức :
_.map(['6', '8', '10'], _.ary(parseInt, 1));
// → [6, 8, 10]
Không cần sử dụng lambdas và / hoặc đưa ra radix
tham số parseInt
, chỉ cần sử dụng parseFloat
hoặc Number
thay vào đó.
Lý do:
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
Nó ngắn hơn.
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 parseInt
hoạ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
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);
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));
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.
Lót
Array.from(a.split(','), Number)