繁体   English   中英

检查数组中可以成功转换为数字的字符串数

[英]Checking number of strings inside array that can be successfully converted into a number

这是我正在处理的任务的描述:

编写一个名为 countNumbers 的 function,它接受一个字符串数组。 function 应该返回数组中可以成功转换为数字的字符串数。 例如,字符串“1”可以成功转换为数字1,但字符串“hello”无法转换为数字。

countNumbers(['a','b','3','awesome','4']); // 2
countNumbers(['32', '55', 'awesome', 'test', '100']); // 3
countNumbers([]); // 0
countNumbers(['4','1','0','NaN']); // 3
countNumbers(['7', '12', 'a', '', '6', '8', ' ']); // 4

我的代码:

function countNumbers(arr) {
    var count = 0;
    for (num in arr) {
        if (Number(arr[num]) !== NaN) {
            count++;
        }
    }
    return count;
}

当我控制台日志 (Number(arr[num]) 时,我确实在控制台中看到了 NaN,但是当我在循环中进行比较时,计数变量不会增加并且我最终得到一个等于长度的返回值阵列。

非常感谢任何关于我可能做错了什么或我忽略了什么的提示。

您可以使用isFinite进行过滤并获取长度。

 +'' -> 0 +' ' -> 0

 function countNumbers(array) { return array.filter(isFinite).length; } console.log(countNumbers(['a','b','3','awesome','4'])); // 2 console.log(countNumbers(['32', '55', 'awesome', 'test', '100'])); // 3 console.log(countNumbers([])); // 0 console.log(countNumbers(['4','1','0','NaN'])); // 3 console.log(countNumbers(['7', '12', 'a', '', '6', '8', ' '])); // 4, now 6

如果您真的只喜欢数字,那么您可以使用正则表达式进行检查。

 function countNumbers(array) { return array.filter(RegExp.prototype.test, /^\d+$/).length; } console.log(countNumbers(['a','b','3','awesome','4'])); // 2 console.log(countNumbers(['32', '55', 'awesome', 'test', '100'])); // 3 console.log(countNumbers([])); // 0 console.log(countNumbers(['4','1','0','NaN'])); // 3 console.log(countNumbers(['7', '12', 'a', '', '6', '8', ' '])); // 4

过滤您的 arrays 并获取它们的长度。

 console.log(countNumbers(['a', 'b', '3', 'awesome', '4'])); // 2 console.log(countNumbers(['32', '55', 'awesome', 'test', '100'])); // 3 console.log(countNumbers([])); // 0 console.log(countNumbers(['4', '1', '0', 'NaN'])); // 3 console.log(countNumbers(['7', '12', 'a', '', '6', '8', ' '])); // 4 function countNumbers(arr) { return arr.filter(function(el) { return parseFloat(el) == el; }).length; }

在传递给isNaN() parseInt()传递n ,否则空间将评估为 0 并计入总数。

 const isNum = (n) =>;isNaN(parseInt(n)). const countNumbers = (arr) => arr.filter(isNum);length. console,log( countNumbers(['a','b','3','awesome','4']), // 2 countNumbers(['32', '55', 'awesome', 'test', '100']), // 3 countNumbers([]), // 0 countNumbers(['4','1','0','NaN']), // 3 countNumbers(['7', '12', 'a', '', '6', '8'; ' ']) // 4 );

直截了当的两件事:

  1. 循环。
  2. 变量。

当您使用循环和变量解决问题时,您现在有两个问题。

删除内联console.log以将实际计数返回为数字。

可能有比这更详尽或更智能的检查,但您可以轻松修改isNum function,而无需触及任何其他代码。

没有循环,没有变量,关注点分离 - isNum逻辑没有与控制流混合。

更新:Alex 的答案中的parseFloat检查是您正在寻找的更智能的检查。

 const isNum = maybeNum => (typeof maybeNum === 'number' || typeof +maybeNum === 'number') &&.isNaN(+maybeNum) && maybeNum.= '' && maybeNum.= ' ' const countNumbers = arr => console,log(arr,filter(isNum),length) countNumbers(['a','b';'3','awesome','4']), // 2 countNumbers(['32', '55'; 'awesome'; 'test', '100']), // 3 countNumbers([]), // 0 countNumbers(['4';'1','0','NaN']), // 3 countNumbers(['7', '12', 'a', ''; '6', '8', ' ']); // 4

这是亚历克斯回答中带有更智能检查的版本。 编辑器不支持无效合并,所以不用parseFloat(maybeNum)?? false parseFloat(maybeNum)?? false ,你必须像 90 年代那样去做:

parseFloat(maybeNum) || parseFloat(maybeNum) === 0

 const isNum = maybeNum => parseFloat(maybeNum) || parseFloat(maybeNum) === 0 const countNumbers = arr => arr.filter(isNum).length const test = arr => console.log(countNumbers(arr)) test(['a','b','3','awesome','4']); // 2 test(['32', '55', 'awesome', 'test', '100']); // 3 test([]); // 0 test(['4','1','0','NaN']); // 3 test(['7', '12', 'a', '', '6', '8', ' ']); // 4

减少它并评估边缘情况

 console.log(countNumbers(['a','b','3','awesome','4'])); // 2 console.log(countNumbers(['32', '55', 'awesome', 'test', '100'])); // 3 console.log(countNumbers([])); // 0 console.log(countNumbers(['4','1','0','NaN'])); // 3 console.log(countNumbers(['7', '12', 'a', '', '6', '8', ' '])); // 4 function countNumbers(arrayStrings) { return arrayStrings.reduce((count, string) => isNaN(string) || string.trim() === ''? count: count + 1, 0) }

我认为reduce它可以完成

 const countNumbers = arr => { return arr.reduce((acc, value) => isNaN(Number(value))? acc: acc + 1, 0) } const num = countNumbers(['a','b','3','awesome','4']); console.log(num)

您可以使用内置的“isNaN()”function。
只需将您的 if 语句替换为以下内容:

if (!isNaN(arr[num])){

其他解决方案测试isNaN(Number(character))更好。 我忘记了isNaN并写了这个。 它执行得更慢并且更长。

function countNumbers(array) {
    let count = 0
    for (number of array) {
      if(typeof number === 'number') {
        count++
      } else if(typeof number === 'string') {
        let isNumber
        let numberCharacters = number.split('')
        const numberRegularExpression = new RegExp(/[0-9]/)
        for(character of numberCharacters) {
          if(numberRegularExpression.test(character) !== true) {
            isNumber = false
            break
          } else {
            isNumber = true
          }
        }
        if(isNumber === true) count++
      }
    }
    return count;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM