【问题标题】:function that checks the number of times a character is used in a string检查字符串中字符使用次数的函数
【发布时间】:2015-07-14 14:25:12
【问题描述】:

我正在编写一个函数,它将字符串作为参数,检查给定字符(在本例中为“B”),然后返回一个整数,该整数反映该字符出现的次数。我知道这可以使用正则表达式等来完成,但是我使用的教程到目前为止没有提到正则表达式。代码时间:

function countBs(string) {
  var i = 0;
  var n = 0;
  var position = string.charAt(n);

  while (i < string.length) {
    if (string.charAt(n) == "B")
      n += 1;
      i++; //This line causes the following else statement to throw a syntax error. But it's the only way I can think of to have the loop continue iteration *while* checking for equivalence to "B" 
    else
      i++;
    return n;
  }

}

然后检查console.log(countBs("ABBA"));

【问题讨论】:

  • 运行此代码时,会出现控制台错误。在 Chrome devtools 中,它是“SyntaxError: Unexpected token else”。你看控制台了吗?那会提醒你这个问题。一般来说,在发布到 SO 之前始终查看控制台是否有错误是一个好主意。这里的人不是语法检查员。
  • 是的,我看到了语法错误,并在我注释掉的行中提到了它。我不确定我为什么会得到它,但从@karma_geek 的回复中意识到这是由于缺少花括号。到目前为止,我所遵循的教程还没有使用花括号来执行条件代码。所以我很茫然。

标签: javascript if-statement while-loop


【解决方案1】:

尝试用花括号括起来:

if (string.charAt(n) == "B")
  {    n += 1;
       i++;
  } 

else 需要之前的 if,并且两者之间没有其他语句。 i++if 之外。

【讨论】:

  • 啊,我明白了。感谢您提供有关 if/else 语句中大括号用法的说明。我在else 中有i++,因为我希望条件继续迭代,即使string.charAt(n) != "B"
  • 另外,如果您在两个语句中都有 i++ - if 和 else,则根本不需要 i++
  • 感谢您的提示!我想我现在大部分已经弄清楚了。我只是将i++ 移到了条件语句之外。现在我可以检查字符串中出现“B”的次数直到另一个字符出现了。因此,如果我将“BBB”作为字符串,则它计为 3,但如果“BABY”仅计为 1。请尽快接受您的答案。
  • 我避免无缘无故投反对票,但我不同意通过发现 OP 的开发环境完全能够检测到的语法错误来清除绿色复选标记,并且 OP 完全能够查看自己。恕我直言,一个正确的答案会将这个问题视为一个关于如何调试程序的问题,并提供他自己可以遵循的步骤来找到问题。毕竟,OP 真的会在每次出现语法错误时向 SO 发帖吗? “给男人一条鱼。”
  • 另外,这个答案是错误的,因为它没有修复string.charAt(n)部分,应该是string.charAt(i)。它留下了返回在循环内的逻辑错误。你测试你的答案了吗?作为次要问题,它没有指出未使用的position 变量。
【解决方案2】:

你的代码很糟糕。

function countBs(string) {
  var i = 0;
  var n = 0;
  // var position = string.charAt(n); // REMOVE--NOT NECESSARY

  while (i < string.length) {    
    if (string.charAt(i) == "B")      // i, NOT n
      n++;                            // CONSISTENCY IN ADD-ONE SYNTAX
      // i++;                         // INCREMENT ONCE BELOW
    //else
      i++;                   
  }
  return n;                           // MUST GO OUTSIDE THE LOOP
}

因此正确的代码是:

function countBs(string) {
  var i = 0;
  var n = 0;

  while (i < string.length) {      
    if (string.charAt(i) == "B") n++;
    i++;
  }
  return n;                        
}

使用while 循环并没有什么特别的问题,但for 会更自然:

function countBs(str) {
  var n = 0;
  for (var i = 0; i < str.length; i++) if (str[i]== "B") n++;
  return n;                        
}

现代 JS

供您参考,在现代 JS 中,您可以避免循环和变量。首先,让我们编写一个单独的检查函数:

function isB(c) { return c === 'B'; }

然后写

function countBs(str) {
    return str . split('') . filter(isB) . length;
}

或者,使用reduce

function countBs(str) { 
    return str.split('').reduce(function(cnt, c) {
        return cnt + isB(c);
    }, 0);
}

或者,虽然你说你不想使用正则表达式:

function countBs(str) {
    return (str.match(/B/g) || []) . length;
}

如果你是在 ES6 环境中编写,那么使用数组推导

function countBs(str) {
    return [for (c of str) if (isB(c)) c] . length;
}

【讨论】:

  • 感谢您如此彻底的回复!相关问题:什么时候应该使用 while 循环和 for 循环?他们都完成了同样的事情,但一个看起来更自然。我在其他地方读到,如果您不知道需要多久进行一次迭代,您应该使用 while 循环。
  • A for 本质上等同于 while,但增加了初始化一个或多个变量(和/或声明它们)的能力,并指定要在每次迭代中执行的代码.因此,如果您需要做任何这些事情,for 可能会更好。在这种情况下,我们要初始化并声明i,并在每次循环中递增i,所以for 似乎工作得更好。
【解决方案3】:

这是我的答案

function countBs(Str) 
{
  let char = "B" ;
  return  String(Str).split(char).length - 1; 

 } 
function countChar(Str, char) 
{
  return  String(Str).split(char).length - 1; 

 } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2021-07-20
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多