1

所以,我有这个程序要求数组中的最小偶数值,我已经编写了代码,但我似乎错过了一个循环。我会写正确的代码,但我希望有人能解释为什么会有一个while循环

    <HTML>
    <HEAD>
    <SCRIPT LANGUAGE = "JavaScript">

    var number=new Array(10)

  for(var i=0; i<number.length; i=i+1)
{ 
   number[i] =window.prompt('enter number ','')
   number[i] =parseFloat(number[i])
}

  var y = 0 
  while (number[y] % 2 != 0) //get the first even number in the array
{
    y = y + 1
}
//after you exit the while loop y will have the index of the first even number 

var Min 
Min = number[y] 

 for(var i=0; i<number.length; i=i+1)
{
    if (number[i] % 2 == 0)
    {
            if(number[i]<Min)
            {
                    Min= number[i]
            }
    }
}

document.write(Min)

</SCRIPT>
</HEAD>
</HTML>

所以,这部分

  var y = 0 
  while (number[y] % 2 != 0) //get the first even number in the array
{
    y = y + 1
}
//after you exit the while loop y will have the index of the first even number 

我发现很难真正掌握这个循环,如果我可能会问:还有其他方法可以找到数组中的最小值吗?非常感谢!

4

2 回答 2

3

while 循环设置 的第一个值,Min以便后续比较起作用。这是一种更简单、更快捷的方法来做同样的事情:

var min = Infinity; // Start with the biggest number possible
for (var i=myArray.length;i--;){
  var val = myArray[i];
  if (val<min && val%2==0) min = val;
}

这更快,因为 - 与原始代码不同 - 这不会对第一个非偶数值进行两次迭代。for如果原始循环从 index 开始,它的速度将大致相当y,即for (var i=y+1;i<number.length;++i)

它也稍微快一点,因为for循环缓存了数组的长度而不是每次都查找它,并且因为它每次循环只查找数组中的值一次,而不是三次。然而,像 V8 这样的现代 JavaScript 运行时可以优化幼稚代码以使其行为相似,因此这不是很重要的一点。


编辑:为了好玩,这是一种现代的函数式编程方法:

var min = Math.min.apply(Math,myArray.filter(function(n){ return n%2==0 }));

上面用于Array.filter创建仅包含偶数项的新数组,然后用于Function.prototype.apply将值数组作为参数传递给Math.min.

于 2012-05-31T20:28:23.163 回答
0

如果你对如何在现代 Javascript 中做到这一点感兴趣,它是这样的:

minEvenElement = Math.min.apply(Math, myArray.filter(function(e) { return !(e % 2) }))
于 2012-05-31T21:07:07.317 回答