有人可以向我解释为什么这个循环不能给我想要的结果吗?

时间:2015-10-09 19:58:54

标签: javascript arrays

基本上,我正在编写一个算法,它接收一个只有数字的随机数组,并吐出数组中第二高的数字(假设数组中的所有条目都是数字,并且至少有2个条目)。这是代码:

var secondGreatest = function(numberArray){

  var array = numberArray;
  var result = [];

  for(var i = 0; i < array.length; i++){

      if(array[i] === Math.max.apply(Math, array)){
        result.push(array[i]);
        array.splice(i, 1);
      }
  };

  return result[1];

};

所以我正在做的是将数字的输入数组设置为变量“array”。然后我将变量“result”设置为空数组。

在for循环中,我指定如果第i个位置的数组等于数组的最大数,则将该数字推入空数组并从原始数组中删除该数字。由于“result”数组的编号从最高到最低,我调用result [1]给出第二高的数字。

但是,结果数组只包含一个条目,它是前一个数组的最大数字。之后,for循环似乎停止了。我试过“继续”;声明,但没有任何作用。

对于为什么不起作用的任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

如果您想继续使用Math.max方法,这是一个较短的代码。

var secondGreatest = function(numberArray){
  var top1 = Math.max.apply(Math, numberArray);
  numberArray.splice(numberArray.indexOf(top1));
  return Math.max.apply(Math, numberArray);
};

var arr = [1,3,5,7,4,2];
alert(secondGreatest(arr));

您实际上不需要迭代,实际上迭代将使您有必要在删除最大项目时重置for。 Tushar在评论中的回答虽然更紧凑,但可能更有意义。

答案 1 :(得分:0)

当你进行拼接时,数组正在被重新索引,并且缓存的array.length已经过时了。这就是for循环停止的原因。您可以从最后开始并向后迭代以解决此问题。