条件证明令人困惑

时间:2018-08-25 10:24:28

标签: javascript jquery arrays for-loop if-statement

给出的是res[]

for(let k = 0; k < res.length; k++){
    if($("#getData").val().length == 20){

      //if ((res[k]) != $("#getData").val()) helpText = "No match!";
      // -- Tried this too and a several other options - foreach, else, else if e. g.
      if(!((res[k]) == $("#getData").val()))
        resText = "No match!";
      if((res[k]) == $("#getData").val())
        resText = "Success!";

    $("#result").html(resText);
    }
}

如果定义了!((res[k]) == $("#getData").val())-“ false”条件,它将始终仅使数组中的第一个res[0]项有效。此项可能会正确证明-数组不会迭代。

如果未未定义-“ false”条件,则仅定义“ true”条件即可正常工作。但是这样就没有resText == "No match!";

怎么了...?

1 个答案:

答案 0 :(得分:1)

如@charlietfl所述,您正在遍历数组并更新每个索引处的结果文本。因为您从未停止过循环过程,所以这实际上意味着您只能从数组中的最后一项获得结果。如果您的“成功!”值是20个项目数组中的第14个项目,您的结果将匹配并通过该迭代,但随后的5个项目的迭代将被覆盖。如果最后一项是成功条件,您将始终获得“成功!”。如果没有,您将始终得到“无匹配!”不管列表中的其他项目。

我的假设是,您要确定的是确定数组中的一项是否匹配,如果匹配,则您希望“成功!”作为输出。如果是这样,我建议:

const success = false;
const getDataVal = $("#getData").val();

if (getDataVal.length == 20) {
    for(let k = 0; k < res.length; k++) {
        if (res[k] == getDataVal) {
            success = true;
            break;
        }
    }
}

$("#result").html(success ? "Success!" : "No match!");

我在这里对您的代码进行了一些重组,以帮助我理解它。请注意,我对此做了一些优化:

  • 将$(“#getData”)。val()操作移出循环并存储到变量,因为该值不会更改。这样可以简化代码,并在处理器上更加容易。
  • 在循环之外移动了值的长度检查条件。循环内容仅在该条件为真时才运行,因此最好将循环包装在该条件中,以使该条件失败时也永远不会运行。
  • 添加了休息时间;找到成功条件后,进入循环以停止循环
  • 将#result的设置移到了循环之外。仅在知道答案后才需要执行此操作,而不必在每次迭代时都执行。
  • 使用带有简单布尔值而不是字符串的三进制来了解比赛状态并输出最终字符串。

如果我的假设是正确的,即您真的有兴趣知道数组中的任何项是否匹配,那么我建议使用数组的some方法对其进行评估。这更具表现力,并且不需要循环结构。

let success = false;
const getDataVal = $("#getData").val();

if (getDataVal.length == 20) {
    success = res.some(function (val)) {
        return val == getDataVal;
    });
}

$("#result").html(success ? "Success!" : "No match!");