Javascript 将字符串转换为整数数组

Javascript 将字符串转换为整数数组,javascript,Javascript,我想将以下字符串'14 2'转换为两个整数的数组。 我该怎么做呢?我们: 您可以获取字符串数组,然后循环将其转换为数字,如下所示: var myArray = "14 2".split(" "); for(var i=0; i<myArray.length; i++) { myArray[i] = +myArray[i]; } //use myArray, it's an array of numbers 首先在空格上拆分字符串: var result = '14 2'.split('

我想将以下字符串
'14 2'
转换为两个整数的数组。 我该怎么做呢?

我们:

您可以获取字符串数组,然后循环将其转换为数字,如下所示:

var myArray = "14 2".split(" ");
for(var i=0; i<myArray.length; i++) { myArray[i] = +myArray[i]; } 
//use myArray, it's an array of numbers

首先在空格上拆分字符串:

var result = '14 2'.split(' ');
然后将字符串的结果数组转换为整数:

for (var i in result) {
    result[i] = parseInt(result[i], 10);
}

只是为了好玩,我想我也应该加入一个
forEach(f())
解决方案

var a=[];
"14 2".split(" ").forEach(function(e){a.push(parseInt(e,10))});

// a = [14,2]

适用于现代浏览器的快捷方式:

'14 2'.split(' ').map(Number);

// [14, 2]`

所以…我知道是老线程,但是…

编辑 @罗科穆索里诺捕得很好;这里有一个替代方案:

TL;医生:

 const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))]

错误:
注意这个foo.split(“”).map(数字).filter(布尔);//[5,6]

在这里列出的更优雅的解决方案中有一个微妙的缺陷,特别是@amillara和@Marcus的其他漂亮答案

当字符串数组的元素不是整数时,可能会出现问题,可能是在没有对输入进行验证的情况下。举个人为的例子

问题:

 const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))]

因为您显然想要一个纯整数数组,所以这是一个问题。老实说,直到我将粘贴的SO代码复制到脚本中,我才发现这一点…:/


(稍微少一点芭蕾舞者)修复:

 const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))]

所以,现在即使你有垃圾整型字符串,你的输出也是一个纯整数数组。其他人在大多数情况下都很性感,但我确实想提供我最随意的w'actually。不过,值得我赞扬的是,这仍然是一条单行线


希望它能节省别人的时间

针对
parseInt
的点-方法:

无需使用lambdas和/或为
parseInt
提供
radix
参数,只需使用
parseFloat
Number


原因:

 const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))]
  • 它正在工作:

    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
    
  • 它比较短

  • parseInt
    -approach-不:

    //执行时间度量函数
    //保持简单,是吗?
    >var f=(函数(arr,c,n,m){
    变量i,t,m,s=n();
    对于(i=0;i++f(Number)//第一次启动,只需预热缓存
    >3971//nice=)
    >f(数字)
    >3964//还是一样
    >f(函数(e){return+e})
    >5132//是的,只是稍微慢一点
    >f(函数(e){return+e})
    >5112//第二次运行……并且正常。
    >f(浮动)
    >3727//比.map(数字)快一点
    >f(浮动)
    >3737//一切正常
    >f(函数(e){return parseInt(e,10)})
    >21852//awww,多么可爱。。。
    >f(函数(e){return parseInt(e)})
    >22928//也许,没有“10”?…没有。
    >f(函数(e){return parseInt(e)})
    >22769//第二次运行……没有任何变化。
    >f(数字)
    >3873/又一次
    >f(浮动)
    >3583//
    >f(函数(e){return+e})
    >4967//
    >f(函数(e){return parseInt(e,10)})
    >21649//dammit'parseInt'!>_<
    

  • 注意:在Firefox中,parseInt的运行速度大约是其他浏览器的4倍,但仍然比其他浏览器慢。总的来说:
    +e
    parseInt

    '14 2'.split(' ').map(x=>+x);
    
    // [14, 2]`
    
    在“代码高尔夫”中,保存1个字符。
    这里的“+”是“一元加”运算符,与parseInt类似。

    更好的单线解决方案:

    let idsArray = ids.split(',').map((x) => parseInt(x));
    
    var answerInt = [];
    var answerString = "1 2 3 4";
    answerString.split(' ').forEach(function (item) {
       answerInt.push(parseInt(item))
    });
    

    如果数字可以用多个空格分隔,则最安全的做法是将字符串拆分为一个或多个连续的空白字符(包括制表符和规则空格)。对于正则表达式,这将是
    \s+

    然后,您可以使用
    Number
    函数对每个元素进行转换。请注意
    parseInt
    将不起作用(即
    arr.map(parseInt)
    )因为
    map
    将三个参数传递给映射函数:元素、索引和原始数组。
    parseInt
    接受基或基数作为第二个参数,因此它最终将以索引为基,通常导致结果中出现许多
    NaN
    s。但是,
    Number
    忽略任何参数它不是第一个,所以它直接起作用

    const str = '1\t\t2   3 4';
    const result = str.split(/\s+/).map(Number); //[1,2,3,4]
    
    要删除不是数字的元素,可以与一起使用

    您还可以使用匿名函数作为映射回调函数,并使用一元加号运算符将每个元素转换为一个数字

    const str = '1\t\t2   3 4';
    const result = str.split(/\s+/).map(x => +x); //[1,2,3,4]
    
    通过回调的匿名函数,您可以决定使用哪些参数,因此
    parseInt
    也可以工作

    const str = '1\t\t2   3 4';
    const result = str.split(/\s+/).map(x => parseInt(x)); //[1,2,3,4]
    

    这是一个字符串数组,而不是数字。是的,是误读了。剩下的请参见Marcus Whybrow或Nick Craver的答案。您应该始终将基数参数传递给
    parseInt()
    ,否则您可能会在其中得到八进制。如果字符串不是以
    0
    0x
    开头,则应该可以。如果它们不是(看看你是如何在前面加上一个假设的?)…为什么还要加上3个字符以使其对所有这些情况都正确?不是所有浏览器都支持这一点-它会突破IE,这是一个JavaScript 1.6+功能。另外,我在另一个回答中说,始终将基数传递给
    parseInt()
    。我非常期待在任何浏览器中都能使用
    .map
    和类似的JS,而不需要额外的库。shorter:
    for(var I=myArray.length;I--)myArray[I]=myArray[I]|0;
    使用按位转换和较短的循环或ES5:
    myArray.forEach(函数(x,y,z){z[y]=x | 0})
    @vsync-当然……但是当任何编译器都想把它缩短得比这还要短的时候,为什么要让维护它变得痛苦呢?:)清晰度值得多加几个字节,特别是当它一旦缩小,实际上不会长很多的时候。因为这一次,我不会缩小我发布的代码,这样其他人就可以阅读我的代码并看到发生了什么,第二,按位操作比parseInt快得多。@vsync-确保在所有浏览器中测试该声明,我认为我会发现+更可读…如果你测试
    const str = '1\t\t2   3 4';
    const result = str.split(/\s+/).map(Number); //[1,2,3,4]
    
    const str = '1\t\t2   3 ab  4 c';
    const result = str.split(/\s+/).map(Number).filter(x => !isNaN(x)); //[1,2,3,4]
    
    const str = '1\t\t2   3 4';
    const result = str.split(/\s+/).map(x => +x); //[1,2,3,4]
    
    const str = '1\t\t2   3 4';
    const result = str.split(/\s+/).map(x => parseInt(x)); //[1,2,3,4]