遍历数字和字母数组并仅提取数字?

Looping through an array of numbers and letters and extract only the numbers?

我想遍历一个数字和字母数组并只提取数字。 我尝试使用 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;
    }
}
  1. 如果你只想要数字,那么有很多方法可以做到。但最简单的方法是使用正则表达式,

    console.log("55abcdef6ghij78".match(/\d+/g).join(""));
    // 55678
    

    这会找到字符串中所有连续的数字(一个或多个数字),并将它们 returns 作为一个数组,我们最终将所有内容连接在一起得到一个字符串。

  2. 如果你希望所有的数字都是数组中的独立元素,那么你可以稍微调整正则表达式,像这样

    console.log("55abcdef6ghij78".match(/\d/g));
    // [ '5', '5', '6', '7', '8' ]
    
  3. 如果你想把号码分组,那就不要加入他们

    console.log("55abcdef6ghij78".match(/\d+/g));
    // [ '55', '6', '78' ]
    
  4. 如果你想在分组后立即将它们转换为数字,你可以map结果数组到Number函数,像这样

    console.log("55abcdef6ghij78".match(/\d+/g).map(Number));
    // [ 55, 6, 78 ]
    

除此之外,如果你想修复你的程序,那么有两个主要错误。

  1. typeof str[i] === 'number'.

    str 中的元素已经仅为字符串类型。因此,它们永远不会等于 number。要解决此问题,您可以使用经典技巧,

    if (+str[i] == str[i])
    

    这会将当前字符串转换为数字并将其与它的字符串值进行比较。如果相等,则表示当前元素为数字

  2. 除此之外,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' ]

首先尝试将字符解析为整数,然后检查类型。

if (parseInt(str[i])) {
    numArr.push(str[i]);
}

正如指出的那样。 typeof NaN 也是 number。所以 typeof parseInt('a') 不会起作用。

一些不错的答案,但对我来说最简单的方法是先删除非数字,然后创建数组,所以:

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。不要忘记声明变量,按照惯例,以大写字母开头的函数名称是为构造函数保留的。