将字符串转换为整数数组

时间:2010-11-27 11:41:13

标签: javascript

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

12 个答案:

答案 0 :(得分:200)

适用于现代浏览器的快速浏览器:

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

// [14, 2]`

答案 1 :(得分:83)

您可以.split()获取一系列字符串,然后循环将其转换为数字,如下所示:

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

+myArray[i]只是进行数字转换的快捷方式,如果您确定它们是整数,那么您可以这样做:

for(var i=0; i<myArray.length; i++) { myArray[i] = parseInt(myArray[i], 10); } 

答案 2 :(得分:35)

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

修改

@RoccoMusolino有一个很好的捕捉;这是另一种选择:

<强> TL; DR:

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

错误"5 6 note this foo".split(" ").map(Number).filter(Boolean); // [5, 6]

这里列出的更优雅的解决方案存在一个微妙的缺陷,特别是@amillara和@Marcus的美妙答案。

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

问题:


var effedIntArray = "5 6 7 69 foo".split(' ').map(Number); // [5, 6, 7, 69, NaN]

因为你显然想要一个PURE int数组,所以这是一个问题。 老实说,在我将SO代码复制粘贴到我的脚本中之前,我没有抓住这个......:/


(稍微不那么bal) 修复:


var intArray = "5 6 7 69 foo".split(" ").map(Number).filter(Boolean); // [5, 6, 7, 69]

所以,现在即使你有crap int字符串,你的输出也是纯整数数组。其他人在大多数情况下都非常性感,但我确实想提供我的大多数 wactly 。尽管如此,它仍然是一个单行的...

希望能节省一些时间!

答案 3 :(得分:24)

var result = "14 2".split(" ").map(function(x){return parseInt(x)});

答案 4 :(得分:4)

替代Tushar Gupta的答案是:

'14 2'.split(' ').map(x=>+x);

// [14, 2]`

在代码高尔夫中,您可以保存1个字符。 这里的“+”是“一元加”运算符,就像parseInt一样。

答案 5 :(得分:3)

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

var result = '14 2'.split(' ');

然后将结果字符串数组转换为整数:

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

答案 6 :(得分:3)

针对parseInt的观点 - 方法:

不需要使用lambdas和/或将radix参数提供给parseInt,只需使用parseFloatNumber

<强>理由:

  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 - 接近 - 不时,它会更快一点,而会利用缓存:

      // 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'! >_<
    
  4. 注意:在Firefox parseInt中工作速度提高了约4倍,但仍然比其他工作速度慢。总计:+e&lt; Number&lt; parseFloat&lt; parseInt

答案 7 :(得分:2)

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

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

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

要删除不是数字的元素,可以将 Array#filterisNaN 结合使用。

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]

通过匿名函数回调,您可以决定使用哪些参数,因此 parseInt 也可以工作。

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

答案 8 :(得分:0)

为了好玩,我以为我也会抛出一个forEach(f())解决方案。

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

// a = [14,2]

答案 9 :(得分:0)

ul.faq_questions li:after {

content: "";
position: absolute;
width: 10px;
height: 10px;
background:#5d3c95;
-webkit-transform: rotate(-45deg);
right: -5px;
top: 40%;
z-index: 10;

}

答案 10 :(得分:0)

更好的一线解决方案:

var answerInt = [];
var answerString = "1 2 3 4";
answerString.split(' ').forEach(function (item) {
   answerInt.push(parseInt(item))
});

答案 11 :(得分:-3)

我们split function

var splitresult = "14 2".split(" ");