简体   繁体   English

如何将一串数字转换为数字数组?

[英]How to convert a string of numbers to an array of numbers?

I have below string -我有以下字符串-

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

when I do -当我做 -

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

I get b as ["1", "2", "3", "4"]我得到b["1", "2", "3", "4"]

can I do something to get b as [1, 2, 3, 4] ?我可以做些什么来让b成为[1, 2, 3, 4]吗?

You can use Array.map to convert each element into a number.您可以使用Array.map将每个元素转换为数字。

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

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

Check the Docs检查文档


Or more elegantly as pointed out by User: thg435或者更优雅地指出用户:thg435

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

Where Number() would do the rest:check here Number()将在哪里完成其余的工作:检查这里


Note: For older browsers that don't support map , you can add an implementation yourself like:注意:对于不支持map的旧浏览器,您可以自己添加一个实现,例如:

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

My 2 cents for golfers:我给高尔夫球手的 2 美分:

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

backquote is string litteral so we can omit the parenthesis (because of the nature of split function) but it is equivalent to split(',') .反引号是字符串,所以我们可以省略括号(因为 split 函数的性质),但它等同于split(',') The string is now an array, we just have to map each value with a function returning the integer of the string so x=>+x (which is even shorter than the Number function (5 chars instead of 6)) is equivalent to :字符串现在是一个数组,我们只需将每个值映射到一个返回字符串整数的函数,因此x=>+x (它甚至比Number函数(5 个字符而不是 6 个字符)更短)等价于:

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

I hope it is a bit more clear.我希望它更清楚一点。

This is very simple.Such as:这很简单。例如:

["1", "2", "3", "4"].map(i=>Number(i))

you can run the demo.你可以运行演示。

 let result = ["1", "2", "3", "4"].map(i=>Number(i)); console.log(result);

Array.from() for details go to MDN Array.from() 详情请参考MDN

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

or或者

let c = ["1", "2", "3", "4"].map(Number);

b and c is an array of numbers. bc是一个数字数组。

demonstration:示范:

 let a = "1,2,3,4"; let b = Array.from(a.split(','),Number); let c = ["1", "2", "3", "4"].map(Number); console.log(`b: ${b}, c: ${c}`);

Map it to integers:将其映射为整数:

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

map looks at every array item, passes it to the function provided and returns an array with the return values of that function. map查看每个数组项,将其传递给提供的函数并返回一个包含该函数返回值的数组。 map isn't available in old browsers, but most libraries like jQuery or underscore include a cross-browser version. map在旧浏览器中不可用,但大多数库(如jQueryunderscore )都包含跨浏览器版本。

Or, if you prefer loops:或者,如果您更喜欢循环:

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

+string will try to change the string to a number. +string将尝试将字符串更改为数字。 Then use Array.map function to change every element.然后使用Array.map函数来改变每个元素。

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

A more shorter solution: map and pass the arguments to Number :更短的解决方案:映射并将参数传递给Number

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

一个班轮

Array.from(a.split(','), Number)

There's no need to use lambdas and/or give radix parameter to parseInt , just use parseFloat or Number instead.无需使用 lambda 和/或为parseInt提供radix参数,只需使用parseFloatNumber代替。

Reasons:原因:

  1. It's working:它正在工作:

     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. It's shorter.它更短。

  3. It's a tiny bit quickier and takes advantage of cache, when parseInt -approach - doesn't :parseInt -approach - 没有时,它会更快一点并且利用缓存

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

Notice: In Firefox parseInt works about 4 times faster, but still slower than others.注意:在 Firefox 中, parseInt的工作速度大约快 4 倍,但仍然比其他速度慢。 In total: +e < Number < parseFloat < parseInt总计: +e < Number < parseFloat < parseInt

As a variant you can use combiantion _.map and _.ary methods from the lodash library .作为变体,您可以使用lodash 库中的_.map_.ary方法。 Whole transformation will be a more compact.整个改造将更加紧凑。 Here is example from the official documentation :以下是官方文档中的示例:

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

The underscore js way -下划线js方式——

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

Matt Zeunert 的带有使用箭头功能的版本(ES6)

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

This works amazing if you need to convert an array of strings to numbers.如果您需要将字符串数组转换为数字,这将非常有用。

const numbers = arr => arr.map(Number);
numbers(['1', '2', '3','4']);     // [1, 2, 3, 4]

Since all the answers allow NaN to be included, I thought I'd add that if you want to quickly cast an array of mixed values to numbers you can do.由于所有答案都允许包含NaN ,因此我想补充一点,如果您想快速将一组混合值转换为可以执行的数字。

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.

You can use JSON.parse , adding brakets to format Array您可以使用JSON.parse ,添加括号来格式化数组

 const a = "1,2,3,4"; const myArray = JSON.parse(`[${a}]`) console.log(myArray) console.info('pos 2 = ', myArray[2])

您可以在一行中将字符串数组转换为数字数组:

const arrayOfNumbers = arrayOfStrings.map(e => +e);

another way is combination of split and join 另一种方法是组合和拆分

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

let ar = [ '682',    '874',    '906',    '11168',  '73714',
  '74377',  '74034',  '138860', '138891', '139161', '139562',
  '139733', '139560', '74049',  '139759', '139934', '140104',
  '141335', '141356', '141334', '141337', '141360', '141358',
  '141365', '141419', '143333', '151477', '147342', '141355',
  '167847', '192141', '196760', '191687', '197351', '197055',
  '198852', '198731', '198816', '199034', '200053', '199226',
  '217818', '200055', '222039', '230533', '230530', '231127',
  '222042', '231100', '236171', '236913', '236980', '237015',
  '237016', '237052', '237551', '237560', '237590', '237637',
  '237733', '237731', '237655', '238890', '238910', '238837',
  '238926', '238972', '238925', '239755', '239696', '239898',
  '240037', '239909', '240036', '240082', '240097', '240526',
  '240770', '678151', '678950', '678985'];
let arry=[]
ar.map(arr=>{
arry.push(parseInt(arr))
});

console.log(arry);

Use Array.from for this, Try this:为此使用Array.from ,试试这个:

 let b = ["1", "2", "3", "4"]; b = Array.from(b,Number); console.log(b);

you can do:你可以做:

b.map(num=>parseInt(num))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM