【问题标题】:Javascript for-loop only goes as far as the first array elementJavascript for 循环只到第一个数组元素
【发布时间】:2017-07-28 21:08:49
【问题描述】:

我正在尝试将用户输入与数组元素进行比较并相应地更改变量的值,但 for 循环并未遍历数组的所有元素,它在第一个停止。为什么不将输入与数组的所有元素进行比较?

<p>Month</p>
// Get Number Of Month (Jan = 1, Feb = 2, Mar = 3, etc.)
<input id="monthNumber" type="number"><br><br> 

<button onclick="calculator()">Show</button><br><br>

<span id="result"></span><br><br>

还有代码

function getNumOfDays(){
    var array = new Array(1,3,5,7,8,10,12, 01, 03, 05, 07, 08);
    var monthNumber = document.getElementById("monthNumber").value;
    var x;

    for(var i = 0; i <= array.length; i++) {
        if(monthNumber == array[i]) { 
            x = 31; 
        } else {
            x = 30; 
        } 
        return (array[i] + " " + x)  //it always returns 1 to array[i]
    }
} 

function calculator2() {
    document.getElementById("result").innerHTML=getNumOfDays();
}

请在浏览器上尝试:

    <p>Month</p>
        // Get Number Of Month (Jan = 1, Feb = 2, Mar = 3, etc.)
        <input id="monthNumber" type="number"><br><br> 

        <button onclick="calculator()">Show</button><br><br>

        <span id="result"></span><br><br>

        <script>
    function getNumOfDays(){

        var array = new Array(1,3,5,7,8,10,12, 01, 03, 05, 07, 08);
        var monthNumber = document.getElementById("monthNumber").innerHTML;
        var x;
    console.log(monthNumber);
        for(var i = 0; i <= array.length; i++) {
            if(monthNumber == array[i]) { 
                x = 31; 
                break;
            } else {
                x = 30; 
            }   
        }

        return x;
    } 


    function calculator() {

      document.getElementById("result").innerHTML=getNumOfDays();
    }



    </script>

【问题讨论】:

  • 看来你真正想做的是在循环内调用函数,而不是函数内有循环...... 对于数组中的每个月调用该方法来计算多少天...
  • 另外,旁注:您的逻辑在这里有缺陷。您假设没有 31 天的每个月将有 30 天。二月呢?
  • 是的,它是如此简单,我们不知道如何解释它与我们已有的不同 - 将您的 return 语句移到循环之外。
  • 约翰尼,您正在寻求帮助,说它在 1 次迭代后停止。我们告诉你为什么。如果它总是返回 30,那是一个单独的问题。
  • 当月输入08 会打印 30 吗?也许你应该学习使用调试器来看看你的代码在做什么以及什么时候做的。

标签: javascript arrays for-loop


【解决方案1】:

您的首要问题是您在迭代完成之前返回。

另一个问题是(可能)您应该只查找 ID 为 monthNumber 的元素的 innerHTML。 (如果 monthNumber 未定义,那么它将始终返回 30,如果没有找到更多代码/调试数据就不可能知道,因为您似乎根本没有调试)。

另一个问题是,如果遇到monthNumber == array[i],您并没有打破循环。这样想,假设monthNumber3,果然monthNumber == array[i] (i = 3) 是真的。但是您仍在迭代,所以现在当它进入下一次迭代array[i] = 5 时,您将覆盖x 现在等于30 而不是31。所以一旦发现条件满足,就必须跳出循环。

我写了一个工作示例,可以满足您的需求(减去 2 月)。不过有一些建议,尽量不要对回答你问题的人无礼。很不清楚你想要什么,你的实际问题被回答了很多次。我知道这可能很困难,但请尽量与您的问题保持联系,如果您遇到其他问题,请提出另一个问题。

See here

<p id="monthNumber">
2
</p>

console.log(getNumOfDays());

function getNumOfDays(){
    var array = new Array(1,3,5,7,8,10,12, 01, 03, 05, 07, 08);
    var monthNumber = document.getElementById("monthNumber").innerHTML;
    var x;

    for(var i = 0; i <= array.length; i++) {
        if(monthNumber == array[i]) { 
            x = 31; 
            break;
        } else {
            x = 30; 
        }   //it always returns 1 to array[i]
    }

    return x;
} 

【讨论】:

  • 感谢您的耐心等待。我对 javascript 很陌生,有时会很沮丧。我不明白的一件事:您发布的代码返回 2,而不是 31 或 30,并且没有用户输入的地方。我应该在浏览器上运行它吗?
  • 不,我发布的代码返回 30 或 31(返回如函数返回值)。我只是将 2 放在 html 元素中作为测试我自己的一种方式。 2无关紧要,你可以放任何你想要的东西。我从 html 元素中获取值(在这种情况下为2),并使用它与数组中的所有元素进行比较。如果它在数组中,它将返回 31 和 break 循环,否则它将返回 30。同样,二月没有 30 或 31 天,因此您需要稍微修改该逻辑。这应该可以帮助您入门,并回答您的所有问题。
  • 我只是在使用您自己的逻辑,您似乎有一个元素可以从中检查值。我制作的元素完全无关紧要。我只是在公元前我不知道您使用的是哪种元素。您没有发布该代码。没关系,这足以让您入门。
  • 谢谢。我在浏览器上尝试了你的代码,但它仍然不起作用:当我点击按钮时,它总是给我 30。我认为正在发生的事情是我无法解释我需要什么。但是谢谢你的帮助。我会看看我是否可以更好地提出这个问题。谢谢你。我是认真的。
  • 你在说什么?你去我的小提琴了吗?它工作正常。
【解决方案2】:

因为这样:

return (array[i] + " " + x)  //it always returns 1 to array[i]

在 if 或 else 完成后 return 自动结束循环。您应该打印该结果,而不是返回它。

【讨论】:

    【解决方案3】:

    您的return 语句位于for 循环内。放在外面。

    function getNumOfDays(){
    
    // Months with 31 days
    var array = new Array(1,3,5,7,8,10,12, 01, 03, 05, 07, 08);
    
    var monthNumber= parseInt(document.getElementById("monthNumber").value);
    if(monthNumber==2)
       return (monthNumber + " " + x)
    //variable x will change to 30 or 31 according to month user chose
        var x=30;
    
    for(var i = 0; i <array.length; i++)// You had a problem here too. `i`should not be equal to array.length
    
      if(monthNumber== array[i]){
          x = 31; 
          break; //This is not necessary, but it improves performance
     }
    return (monthNumber + " " + x)  //it always returns 1 to array[i]
    
    } 
    

    【讨论】:

    • 不,不是这样,因为代码上的结果总是 30。循环无法正常工作。
    • 立即查看我的解决方案。为什么你有 01,03,05??
    • 为什么要返回array[i]??它不应该只返回x吗?无论如何,它现在有效吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多