【问题标题】:If / Else statement with curly braces带花括号的 if / Else 语句
【发布时间】:2017-06-14 06:34:45
【问题描述】:

我正在尝试创建一个带有两个参数的函数,一个用于数组 (ary),第二个用于将在数组中搜索的名称。

但是,我不明白为什么第一个代码不起作用而第二个代码起作用。

谁能解释一下?

// wrong code
var fruit = ['banana', 'apple', 'cherry', 'watermelon'];
var food = ['pizza', 'rice', 'cheese', 'potato'];
var search = function(ary, name) {
    for (var i = 0; i < ary.length; i++) {
        if (name == ary[i]) {
            return name + " was found!";
        } else {
            return name + " was not found";
        }
    }
};
search(food, 'potato');
//"potato was not found"


// right code
var fruit = ['banana', 'apple', 'cherry', 'watermelon'];
var food = ['pizza', 'rice', 'cheese', 'potato'];
var search = function(ary, name) {
    for (var i = 0; i < ary.length; i++)
        if (name == ary[i]) 
            return name + " was found!";
    return name + " was not found";
};

search(food, 'potato');
//"potato was found!"

谢谢!

【问题讨论】:

  • 在错误的代码中,检查第一项时发生“未找到”。

标签: javascript arrays if-statement search curly-braces


【解决方案1】:

在第一个示例中,您将在第一次匹配失败时返回,因此在匹配数组的第一项失败后,它将从函数返回。

所以 else 块中的部分,应该移到循环之外。

【讨论】:

    【解决方案2】:
    for (var i = 0; i < ary.length; i++)
        if (name == ary[i]) 
            return name + " was found!";
    return name + " was not found";
    

    等同于:

    for (var i = 0; i < ary.length; i++) {
        if (name == ary[i]) {
            return name + " was found!";
        }
    }
    return name + " was not found";
    

    它在遍历数组中的所有项目后返回false。在您提供的错误代码中,它仅检查第一项是否等于name,因为在循环内部无论是否找到它都会返回(因此,如果第一项等于name,它将返回@ 987654326@,如果不是,它将返回false) 因此,不会检查索引1 中的项目,因为该函数已经返回。


    注意:您可以使用 JS 中的默认搜索功能:indexOf,如下所示:

    var search = function(ary, name) {
        if(ary.indexOf(name) != -1) // index is -1 (not valid) then it's not found
            return name + " was found";
        else
            return name + " was not found";
    }
    

    【讨论】:

      【解决方案3】:

      因为在第一个函数中,uou在一次迭代后立即返回;您无需等待整个数组循环;我敢打赌数组的第一个元素是“找到”。

      所以对于您的第一个函数,将找到这些:

      search(fruit, 'banana');
      search(food, 'pizza');
      

      但没有其他人。

      在第二个中,只有在整个数组已经循环但没有找到匹配项时才会返回“未找到”,即当它退出 for 循环时。

      【讨论】:

        【解决方案4】:

        我看到了问题。

        在第一个代码段中,您在 else 语句中返回 false。这意味着第一次通过循环时,您将返回 true 或 false。它只检查第一项。

        【讨论】:

          【解决方案5】:

          在您的第一个版本中,elsefor 循环内,因此该函数在第一次迭代中将始终返回“已找到”或“未找到”。循环永远不会到达第二次迭代。

          在您的第二个版本中,else 不是for 循环体的一部分,因此它仅在循环完成后运行(运行其所有迭代)而不找到匹配项。

          【讨论】:

            最近更新 更多