【问题标题】:javascript for loop, nested if incremental value not matching?javascript for循环,如果增量值不匹配则嵌套?
【发布时间】:2018-08-10 07:26:33
【问题描述】:

我这里有一段代码使用了一个调用 'inArray' 函数并传递用户输入值的 javascript onclick 事件。我正在尝试遍历数组并将输入的 'value' 与数组中的值之一匹配。我不想返回“真/假”,但如果条件 array[i] 等于传递给它的值,那么我想执行“getElement”并放置相应的文字。

        function inArray(aValue) {
            var value = parseInt(aValue);
            var array = [1,2,3,4,5,6,7];
            for (i = 0; i < array.length; i++){
                if (array[i] === value) {
                    document.getElementById('primeOutput').innerHTML =
                            "yes, that's a prime below 200";
                }
              }
            document.getElementById('primeOutput').innerHTML =
                            "not a prime number below 200";
        }

我已将返回类型打印到屏幕上,valuearray 都是面数,打印时它们等于相同的数字,为什么会这样继续打印最后的输出? (不是低于 200 的素数) 注意:当我将 if 语句中的条件翻转为 '!==' 时,它会将第一条语句打印到 id'ed 为 'primeOutput' 的 html 元素.

另外,正如您可能注意到的那样,我只是想将用户输入与 200 以下的素数列表进行比较。虽然有很多方法可以做到这一点,但我真的想找出为什么这段代码会当我知道值在数组中并且两种数据类型都是数字时,不打印第一条语句?

再次感谢任何详细的解释。

【问题讨论】:

  • 因为"not a prime number below 200"在循环之外——没有条件,总是被执行
  • 可能意味着从return; 内部if

标签: javascript arrays loops for-loop iteration


【解决方案1】:

Medet 的回答是正确的,但没有告诉您为什么您的代码不起作用。找到匹配元素后,您将继续循环,无论如何都会调用函数中的最后一行。除了抛出错误或提前返回之外,没有其他方法可以防止它。

您可以使用found 变量来解决此问题:

function inArray(aValue) {
  var value = parseInt(aValue),
    array = [1, 2, 3, 4, 5, 6, 7],
    found = false;

  for (i = 0; i < array.length; i++) {
    if (array[i] === value) {
      found = true;
      break;
    }
  }

  if (found) {
    document.getElementById("primeOutput").innerHTML =
      "yes, that's a prime below 200";
  } else {
    document.getElementById("primeOutput").innerHTML =
      "not a prime number below 200";
  }
}

不过,还有一种更简单的方法:

function inArray(aValue) {
  var value = parseInt(value),
    array = [1, 2, 3, 4, 5, 6, 7];

  return array.indexOf(value) !== -1
}

然后你可以使用这个true/false 值在其他地方渲染输出:

function renderPrimeCheck(aValue) {
  if (inArray(aValue)) {
    document.getElementById("primeOutput").innerHTML =
      "yes, that's a prime below 200";
  } else {
    document.getElementById("primeOutput").innerHTML =
      "not a prime number below 200";
  }
}

【讨论】:

  • 我喜欢你将函数与渲染分开的方式!
【解决方案2】:
// credit: https://stackoverflow.com/a/40200710/2308005
function isPrime(num) {
  for(var i = 2; i < num; i++)
    if(num % i === 0) return false;
  return num !== 1;
}
function inArray(aValue) {
    var value = parseInt(aValue);
    if (value < 200) {
        if (isPrime(value)) {
             document.getElementById('primeOutput').innerHTML = "yes, that's a prime below 200";
        } else {
             document.getElementById('primeOutput').innerHTML = "not a prime number below 200";
        }
    }

【讨论】:

  • 您可能需要先检查value &lt; 200,因为较大的值会使isPrime 需要一段时间
  • 解释...?如果您只是要提供一个替代方案,请标记为与该问题的答案重复。
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
相关资源
最近更新 更多