将字符串转换为整数数组

IT技术 javascript
2021-03-11 12:58:50

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

6个回答

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

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

// [14, 2]`
+1,如果需要,只需为旧浏览器支持添加 polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-26 12:58:50
球。棒极了。如此新鲜,如此干净。
2021-05-01 12:58:50
是的,没错。Number() 是传递给 map 的函数,它转换值。查看托德的回答以获取更多详细信息。
2021-05-07 12:58:50
很好,但这实际上是如何工作的?您正在传入 Number 对象,但我不确定它是如何转换的。我认为你需要传入一个函数来映射。
2021-05-18 12:58:50
很干净的方式!应该是顶级的。
2021-05-20 12:58:50

您可以.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); } 
@vsync - 确保您在所有浏览器上测试该声明,我个人认为 + 更具可读性……如果您进行测试,大多数最新浏览器的差异都可以忽略不计,无论哪种方式 - 取决于引擎。此外,你可以提供一个.min.js.js如果你想公开你的代码......请记住,缩小不是为了默默无闻(或者不应该,因为它对此毫无用处),它是为了减少 HTTP 开销 - 更快的页面加载为您的用户。
2021-05-02 12:58:50
@vsync - 当然......但是当任何编译器将其缩短甚至更多时,为什么要维护它?:) Clarity 值得一些额外的字节,尤其是当它一旦缩小后实际上不会更长。
2021-05-03 12:58:50
更短:for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0;使用按位转换和更短的循环
2021-05-12 12:58:50
因为这一次,我没有缩小我发布的代码,所以其他人可以阅读我的代码并查看发生了什么,其次,按位运算比 parseInt 快得多。
2021-05-16 12:58:50
或使用 ES5: myArray.forEach(function(x,y,z){ z[y]=x|0 })
2021-05-20 12:58:50

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

编辑

@RoccoMusolino 有一个不错的收获;这是一个替代方案:

特尔;博士:

 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 代码复制粘贴到我的脚本中之前,我才发现这一点......:/


(略少-控球) 修正:


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

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

希望它可以节省某人的时间!

你可以.filter(Boolean).filter( (x) => !Number.isNaN(x))
2021-04-22 12:58:50
注意,如果您的字符串包含一个或多个 0,这将不起作用。零转换为 boolean=false,因此布尔过滤器不会保留它。
2021-05-04 12:58:50
手提包对我来说足够了。谢谢,托德!
2021-05-19 12:58:50
var result = "14 2".split(" ").map(function(x){return parseInt(x)});
IE 之所以存在,是因为我们支持它。停止痛苦!
2021-04-28 12:58:50
我非常期待我们什么时候可以.map在任何浏览器中使用JS 中的 JS 而不需要额外的库。
2021-05-10 12:58:50
并非所有浏览器都支持此功能 - 它会在 IE 中崩溃,这是 JavaScript 1.6+ 功能。另外,我在另一个答案中说,始终将基数传递给parseInt().
2021-05-20 12:58:50

Tushar Gupta 答案的替代方法是:

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

// [14, 2]`

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