【问题标题】:Syntax Required for If/Else Statement inside For LoopFor 循环内的 If/Else 语句所需的语法
【发布时间】:2017-08-15 17:18:17
【问题描述】:

我有一个仅在定义了指定变量时才应用 onclick 的函数。一旦定义了该变量,它就会遍历一组嵌套数组以生成用户被发送到的 URL。我在 if 语句的逻辑中添加了一个 else 语句,这样如果不满足条件,用户将被发送到一个默认 URL,该 URL 显示“抱歉,未找到任何项目”。但是,由于它是在一个循环中循环通过不匹配的项目以找到匹配的项目,因此它始终在循环找到匹配项之前应用 else 语句。

有没有更好的语法可以使用?

function applyUrl() {

var locSelect = localStorage.getItem("loc");
var positSelect = localStorage.getItem("posit");
var userSelect = locSelect + " - " + positSelect;
if(localStorage.getItem("posit") != null){

        for (var i = 0; i < sortedArray.length; i++) {
        var stuff = sortedArray[i];
        for (var j = 0; j < stuff.length; j++) {
            if(stuff[j] === userSelect) {
                  window.location.href = stuff[1];
                }else{
                  window.location.href = 'default.html';
                }
            }

        }

    }
}

【问题讨论】:

  • 将条件语句移出第二个循环

标签: javascript for-loop if-statement


【解决方案1】:

我认为最简洁的方法是在 for 循环之外存储一个变量,然后在完成后导航到它,如果你还没有 redirUrl,也只继续循环。

function applyUrl() {

    var locSelect = localStorage.getItem("loc");
    var positSelect = localStorage.getItem("posit");
    var userSelect = locSelect + " - " + positSelect;
    if (localStorage.getItem("posit") != null) {
        var redirUrl;    
        for (var i = 0; i < sortedArray.length && !redirUrl; i++) {
            var stuff = sortedArray[i];
            for (var j = 0; j < stuff.length && !redirUrl; j++) {
                if (stuff[j] === userSelect) {
                    redirUrl = stuff[1];
                }
            }
        }

        window.location.href = redirUrl || 'default.html';
    }
}

一个更好的写法可能是

function applyUrl() {
    var locSelect = localStorage.getItem("loc");
    var positSelect = localStorage.getItem("posit");
    var userSelect = locSelect + " - " + positSelect;
    if (positSelect != null) {
        // must have 2 elements and contain the user selection.
        var selArray = sortedArray.find(v=>v.length >= 2 && v.indexOf(userSelect) !== -1);
        if(selArray) {
            window.location.href = selArray[1];
        } else {
            window.location.href = 'default.html';
        }
    }
}

【讨论】:

  • 您好,先生!这行得通!谢谢你的意见:)
【解决方案2】:

因为 window.location.href 会重定向到另一个页面,所以您可以通过这种方式更改代码逻辑:

for (var j = 0; j < stuff.length; j++) {
    if(stuff[j] === userSelect) {
        window.location.href = stuff[1];
    }
}
window.location.href = 'default.html';

这样,如果没有匹配,就会执行外部重定向。

【讨论】:

    【解决方案3】:

    您应该将默认重定向移动到内部循环之外,并且仅在父循环结束时执行。

    function applyUrl() {   
      var locSelect = localStorage.getItem("loc");
      var positSelect = localStorage.getItem("posit");
      var userSelect = locSelect + " - " + positSelect;
    
      if (localStorage.getItem("posit") != null) {      
        for (var i = 0; i < sortedArray.length; i++) {
          var stuff = sortedArray[i];
          for (var j = 0; j < stuff.length; j++) {
            if (stuff[j] === userSelect) {
              window.location.href = stuff[1];
              return;
            }
          }
        }
    
        window.location.href = 'default.html';          
      }
    }
    

    【讨论】:

    • 您好,先生!我一直在尝试不同的 else/if 语句,但不认为使用计数器等于长度来限制其参与循环。我会尝试一下!感谢您的意见!
    • @FredArnold 如果第一个解决方案没有帮助,我已经编辑了它。
    • @YuriRamos 稍微调整了一下,意识到你根本不需要 if 条件。如果它在循环中的任何一点都没有重定向,那么我可以假设我们应该重定向到默认值。
    • @Purgatory 这两种方法我都试过了,但似乎仍然没有指向正确的 URL。
    • 您是否尝试过我的第三个更改,如上所示,很确定它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多