通过一系列数字和字母循环并仅提取数字?

时间:2015-03-12 02:00:39

标签: javascript string for-loop typeof

我想循环遍历一组数字和字母,只提取数字。 我尝试使用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;
    }
}

3 个答案:

答案 0 :(得分:3)

  1. 如果您只想要数字,那么有很多方法可以做到。但最简单的是使用RegEx,

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

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

  2. 如果您希望所有数字都是数组中的单独元素,那么您可以稍微调整一下RegEx,就像这样

    console.log("55abcdef6ghij78".match(/\d/g));
    // [ '5', '5', '6', '7', '8' ]
    
  3. 如果您想对数字进行分组,as you asked for in the comments则只是不加入

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

    typeof str[i] === 'number'

  5. 除此之外,如果你想修复你的程序,那么有两个重大错误。

    1. str

      number中的元素只能是字符串类型。所以,它们永远不会等于if (+str[i] == str[i]) 。要解决此问题,您可以使用经典技巧

      return

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

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

    3. 所以,您的程序可以像这样修复

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