【问题标题】:Last iteration returns undefined最后一次迭代返回未定义
【发布时间】:2013-11-09 18:21:23
【问题描述】:

当循环遍历这个字符串时,警报会打印出 test 4 次(正确),但最后也会打印出“未定义”。如何使它不返回未定义。

这会返回 - undefinedCAFE ::

alert(match("abcdef", "CAfe"));


function match(string, pattern) {

    var patternUpperCase = pattern.toUpperCase();
    var stringUpperCase = string.toUpperCase();
    var stringConcatenate;
    var answer;

    for (var i = 0; i < patternUpperCase.length; i++) {
        if (patternUpperCase.charAt(i) != undefined) {
            if (patternUpperCase.charAt(i) >= 'A' && patternUpperCase.charAt(i) <= 'Z') {
                stringConcatenate += patternUpperCase.charAt(i);
                alert("test");
            }
        }
    }
    return stringConcatenate;
}

这是函数需要做的:如果模式的所有单个字母都出现在字符串中(不分顺序)(不区分大小写),则返回 true

示例 match("abcdef","@C2D!") 返回真 匹配(“abcdef”,“CAfe”)返回真 match("abcdef","CG") 返回 false

【问题讨论】:

  • 请注意,.charAt() 永远不会返回 undefined。如果索引超出范围,则返回空字符串(例如"")。

标签: javascript loops for-loop undefined


【解决方案1】:

您的错误发生是因为您将未初始化的字符串与其他字符串联系起来。

这一行(第一次迭代):

stringConcatenate += patternUpperCase.charAt(i);

其中 stringConcatenate 尚未初始化为:

stringConcatenate = "undefined" + patternUpperCase.charAt(i);

所以在你的代码中这样做:

var stringConcatenate = "";

访问字符串字符的小提示:
如果您使用String.charAt() 方法,您的返回值测试应该如下:

if(somestring.charAt(x)!="") 
   ... valid

但是,您也可以通过数组运算符[x] 访问字符串中的偏移量。这个确实返回undefined:

if(typeof somestring[x]!="undefined")

【讨论】:

    【解决方案2】:

    为什么不使用正则表达式函数?

    alert( !/[^pattern]/.test(string) );
    

    或者让它符合@符号:

    alert( !/[^pattern]/.replace(/[^a-zA-Z]/, '').test(string) );
    

    最后一个例子删除了除 a-z(小写和大写)之外的所有内容,然后测试剩余字符串中是否有任何禁止字符。

    因为当它发现一个“错误”字符时会给出一个true,所以用!反转它

    【讨论】:

    • 我猜他是故意试图自己实现这个功能。此外,正则表达式会明显变慢。
    • @Martijn 我们还没有在我的大学课堂上学习过正则表达式,所以我不能使用它。
    【解决方案3】:

    先将stringConcatenate设置为字符串变量。

    alert(match("abcdef", "CAfe"));
    
    
    function match(string, pattern) {
    
        var patternUpperCase = pattern.toUpperCase();
        var stringUpperCase = string.toUpperCase();
        var stringConcatenate = '';
    
        for (var i = 0; i < patternUpperCase.length; i++) {
            if (patternUpperCase.charAt(i) != undefined) {
                if (patternUpperCase.charAt(i) >= 'A' && patternUpperCase.charAt(i) <= 'Z') {
                    stringConcatenate += patternUpperCase.charAt(i);
                    console.log(stringConcatenate);
                }
            }
        }
        return stringConcatenate;
    }
    

    【讨论】:

      【解决方案4】:

      错误: 1. stringConcatenate 未初始化。 2. 您的代码不完整,因为它没有检查模式字母在“字符串”中出现的条件。

      这应该可以解决您的问题:

      function fooo(){
      str = "abcdsdfef";
      pattern = "d234g4f";
      var patternUpperCase = pattern.toUpperCase();
      var stringUpperCase = str.toUpperCase();
      var stringConcatenate="";
      var answer = true;
      
      for (var i = 0; i < patternUpperCase.length; i++) {
          if (patternUpperCase.charAt(i) != undefined) {
              if (patternUpperCase.charAt(i) >= 'A' && patternUpperCase.charAt(i) <= 'Z') {
                  stringConcatenate += patternUpperCase.charAt(i);
          if(stringUpperCase.indexOf(patternUpperCase.charAt(i)) == -1){
              answer = false;
              break;
          }
              }
          }
      }
      alert(answer);
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2013-12-22
        相关资源
        最近更新 更多