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]