将字符串转换为整数数组

87 javascript

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

xer*_*r0x 204

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

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

// [14, 2]`
Run Code Online (Sandbox Code Playgroud)

  • +1,如果需要,只需为旧浏览器支持添加 polyfill https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Polyfill (2认同)
  • 是的,没错。Number() 是传递给 map 的函数,它会转换值。查看托德的回答以获取更多详细信息。 (2认同)

Nic*_*ver 84

您可以.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
Run Code Online (Sandbox Code Playgroud)

+myArray[i]只是一种快速进行数字转换的方法,如果您确定它们是整数,您可以这样做:

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

  • short:`for(var i = myArray.length; i--;)myArray [i] = myArray [i] | 0;`使用按位转换和更短的循环 (5认同)
  • @vsync - 确保你在所有浏览器中测试这个声明,我个人认为+更具可读性......如果你测试,大多数最新的浏览器都有一个可以忽略的差异,无论哪种方式 - 取决于引擎.此外,如果你想暴露你的代码,你可以提供一个`.min.js`和`.js` ...请记住,缩小不是为了默默无闻(或者不应该,因为它对此毫无用处),它是为了减少HTTP开销 - 为用户提供更快的页面加载. (5认同)
  • @vsync - 确定......但是当任何编译器要将其缩短甚至更多时,为什么要让它保持痛苦?:) Clarity值得花费一些额外的字节,特别是当它一旦缩小时它实际上不会长得多. (3认同)

Tod*_*odd 35

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

编辑

@RoccoMusolino收获很好; 这是另一种选择:

TL; DR:

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

错了:"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]
Run Code Online (Sandbox Code Playgroud)

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


(略少-控球) 修正:


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

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

希望它节省一些时间!

  • 注意,如果你的字符串包含一个或多个0,这将无效.零转换为boolean = false,因此布尔过滤器不会保留它. (5认同)

小智 24

var result = "14 2".split(" ").map(function(x){return parseInt(x)});
Run Code Online (Sandbox Code Playgroud)

  • 并非所有的浏览器都支持这一点 - 它会在IE中破解,这是一个JavaScript 1.6+功能.另外,我在另一个答案中说,总是将一个基数传递给`parseInt()`. (4认同)
  • 我很期待什么时候我们可以在任何浏览器中使用 `.map` 和类似的 JS 而不需要额外的库。 (2认同)

Yan*_*and 5

Tushar Gupta 答案的替代方法是:

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

// [14, 2]`
Run Code Online (Sandbox Code Playgroud)

在代码高尔夫中,您可以保存 1 个字符。这里的“+”是“一元加”运算符,作用类似于 parseInt。