我想循环遍历一组数字和字母,只提取数字。 我尝试使用typeof运算符,但我的代码似乎不起作用
str = "55abcdef6ghij78"
function NumberAddition(str) {
var numArr = [];
str = str.split("");
for (var i = 0; i < str.length; i++) {
if (typeof str[i] === 'number') {
numArr.push(str[i]);
}
return numArr;
}
}
答案 0 :(得分:3)
如果您只想要数字,那么有很多方法可以做到。但最简单的是使用RegEx,
console.log("55abcdef6ghij78".match(/\d+/g).join(""));
// 55678
这将查找字符串中的所有连续数字(一个或多个数字)并将它们作为数组返回,我们最终将所有内容连接在一起以获得单个字符串。
如果您希望所有数字都是数组中的单独元素,那么您可以稍微调整一下RegEx,就像这样
console.log("55abcdef6ghij78".match(/\d/g));
// [ '5', '5', '6', '7', '8' ]
如果您想对数字进行分组,as you asked for in the comments则只是不加入
console.log("55abcdef6ghij78".match(/\d+/g));
// [ '55', '6', '78' ]
如果您希望在对它们进行分组后立即将它们转换为数字,则可以map
将结果数组Number
转换为console.log("55abcdef6ghij78".match(/\d+/g).map(Number));
// [ 55, 6, 78 ]
函数,就像这样
typeof str[i] === 'number'
除此之外,如果你想修复你的程序,那么有两个重大错误。
str
。
number
中的元素只能是字符串类型。所以,它们永远不会等于if (+str[i] == str[i])
。要解决此问题,您可以使用经典技巧
return
这会将当前字符串转换为数字,并将其与字符串值进行比较。如果它们相等,则表示当前元素是一个数字。
除此之外,for
语句位于function NumberAddition(str) {
var numArr = [];
str = str.split("");
for (var i = 0; i < str.length; i++) {
if (+str[i] == str[i]) {
numArr.push(str[i]);
}
}
return numArr; // Outside the for loop
}
console.log(NumberAddition("55abcdef6ghij78"));
// [ '5', '5', '6', '7', '8' ]
循环内。
所以,您的程序可以像这样修复
Array.prototype.filter
但这样做的惯用方法是使用function NumberAddition(str) {
return str.split("").filter(function(currentChar) {
return +currentChar == currentChar;
})
}
console.log(NumberAddition("55abcdef6ghij78"));
,就像这样
Number
但是,较短版本将使用console.log("55abcdef6ghij78".split("").filter(Number));
// [ '5', '5', '6', '7', '8' ]
,就像这样
{{1}}
答案 1 :(得分:1)
首先尝试将字符解析为整数,然后检查类型。
if (parseInt(str[i])) {
numArr.push(str[i]);
}
指出。 typeof NaN
也是number
。所以typeof parseInt('a')
无法工作。
答案 2 :(得分:1)
一些好的答案,但对我来说最简单的方法是首先删除非数字,然后创建数组,所以:
var str = '55abcdef6ghij78';
str.replace(/\D/g,'').split(''); // ['5','5','6','7','8'];
你想保留数字序列,所以匹配更好:
str.match(/\d+/g); // ["55", "6", "78"]
如果要对数字求和,请使用reduce:
function numberAddition(s) {
return s.match(/\d+/g).reduce(function(prev, curr){return prev + +curr}, 0);
}
console.log(numberAddition(str)); // 139
注意for循环通常会更快,但不足以解决问题,除非你经常这么做或者使用非常大的数字数组。
PS。不要忘记声明变量,按照惯例,以大写字母开头的函数名称保留给构造函数。