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

290

我有以下字符串 -

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

当我做 -

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

我得到的是 b,值为["1", "2", "3", "4"]

我能否做些什么来将 b 转化为 [1, 2, 3, 4]

18个回答

540
你可以使用Array.map将每个元素转换为一个数字。
var a = "1,2,3,4";

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

请查看文档


正如用户thg435指出的那样,更加优雅。

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

如果你使用Number()函数,它将处理剩下的部分:请在这里查看。


注意: 对于不支持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;
};

4
文档中的“棘手用例”实际上讨论了这个问题。 - Antony
注意:请确保在该链接中检查浏览器版本,IE8不支持Array.map。(令人惊讶,是吧?) - Joe Zack
2
要将字符串转换为数字数组,请使用空字符串作为分隔符:'1234567'.split('').map(Number); - userlond
2
值得注意的是,Number() 不会强制转换为整数,只会转换为数字。如果您需要将其转换为整数,请使用 parseInt()。"1.1,2,3".split(",").map(Number) 的结果是 [1.1, 2, 3],而 "1.1,2,3".split(",").map(item => parseInt(item, 10)) 的结果是 [1, 2, 3] - dtbarne
2
@Sachith - parseInt()的第二个参数是基数。在这种情况下,基数为10。 参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt - techfoobar
显示剩余3条评论

117

我对高尔夫球手的建议:

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

反引号是字符串文字,所以我们可以省略括号(因为split函数的特性),但它等同于split(',') 。现在该字符串已经是一个数组,我们只需使用返回字符串整数的函数映射每个值,所以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

我希望现在更加清晰明了。


7
为什么它会这样工作?似乎不够优雅,因为过于抽象化了。 - Christian Matthew
2
我们为什么要关心map函数使用了多少个字符? - SafeFastExpressive
3
由于这是一份针对“高尔夫爱好者”的版本,如果您不知道我在说什么,请参考以下链接:https://codegolf.stackexchange.com/ - TrapII
2
聪明,但如果我的同事在真实的代码中包含这样的东西,我会狠踢他一脚。 - Wesley Smith
1
@SafeFastExpressive 你可能不知道什么是代码高尔夫。 - TKirishima
显示剩余2条评论

59
这很简单。比如:
["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);


9
简而言之,.map(Number)的意思是将数组中的每个元素转换为数字类型。 - Roko C. Buljan
那不是正确的。他说他有一串数字,而不是一个字符串数组。所以这样不会起作用。在 map(Number) 之前,你需要使用 split(',')。 - Liraz Shaka Amir

28

详情请访问MDN,了解 Array.from() 方法。

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

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

bc是数字数组。

演示:

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


5
这是我发现的最直接的方法! - FonzTech

19

将其映射为整数:

a.split(',').map(function(i){
    return parseInt(i, 10);
})
map 方法遍历数组的每个元素,将其传递给所提供的函数,并返回该函数的返回值组成的新数组。老旧浏览器不支持 map 方法,但是大多数库(如 jQueryunderscore)都包含跨浏览器版本。

或者,如果您更喜欢使用循环:

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

18
更简洁的解决方案:使用map函数并将参数传递给Number

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


17

+string会尝试将字符串转换为数字,然后使用Array.map函数来更改每一个元素。

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

或者更简单的方式是 "1,2,3,4".split(',').map((el) => +el) - Mo Zaatar

10

一句话概括

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

5

不需要使用lambda表达式和/或给parseInt传递radix参数,只需改用parseFloat或Number即可。

原因:

  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:

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

注意:在Firefox中,parseInt的速度大约比其他浏览器快4倍,但仍然比其他方法慢。总体来说:+e < Number < parseFloat < parseInt


4
作为一种选择,您可以使用来自 lodash库的组合_.map_.ary方法。整个转换将更加紧凑。以下是官方文档中的示例:
_.map(['6', '8', '10'], _.ary(parseInt, 1));
// → [6, 8, 10]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接