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


187

我有下面的字符串-

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

当我做 -

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

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

我可以做一些事来报复b[1, 2, 3, 4]

Answers:


25

我给高尔夫球手的2美分:

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

backquote是乱码,所以我们可以省略括号(由于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

我希望它更加清楚。


为什么这样工作?似乎不太优雅,因为它太抽象了。
基督教马修

我们为什么要关心map函数使用多少个字符?
SafeFastExpressive

奇怪的是,在角度7中需要加上括号。
詹姆斯·洛福蒂

@SafeFastExpressive,因为这是“高尔夫球手”的版本,如果您不知道我在说什么:codegolf.stackexchange.com
TrapII

406

您可以使用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;
};

2
文档中的“ Tricky用例”实际上讨论了这个主题。
2013年

87
或简单地说map(Number)
2013年

注意:确保检查该链接中的浏览器版本,IE8不支持Array.map。(令人惊讶,是吗?)
Joe Zack 2015年

1
值得注意的是Number()不会强制整数,只会强制数字。如果您需要强制转换为整数,请使用parseInt()。"1.1,2,3".split(",").map(Number)是,[1.1, 2, 3]"1.1,2,3".split(",").map(item => parseInt(item, 10))is[1, 2, 3]
dtbarne '19

1
@Sachith-parseInt()的第二个参数是基数。在这种情况下
参见

18

将其映射为整数:

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

map查看每个数组项,将其传递给提供的函数,然后返回包含该函数返回值的数组。map在旧的浏览器中不可用,但是大多数库(例如jQuery下划线)都包含跨浏览器版本。

或者,如果您喜欢循环:

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

15

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

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

12

Array.from()有关详细信息,请转到MDN

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

b 是一个数字数组


2
这是我发现的最简单的方法!
FonzTech

11

一个更短的解决方案:映射并将参数传递给Number

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




3

无需使用lambda和/或将radix参数赋予parseInt,只需使用parseFloat或即可Number

原因:

  1. 工作正常:

    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. 它更短。

  3. 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'! >_<

注意:在Firefox中,其parseInt工作速度快大约4倍,但仍比其他人慢。总数:+e< Number< parseFloat<parseInt


3

下划线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);



1

由于所有答案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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.