繁体   English   中英

JavaScript:for循环内的if语句(从数组中查找最大数)

[英]JavaScript: if statement inside for loop (finding largest number from array)

我无法理解此代码如何从数字数组中找到最大的数字。 到目前为止,这是我的理解:

1)声明变量i,并将其赋值为0。
2)for循环:x从0开始,但是会随着x <integers.length(将是5?)的长而递增,所以我们将谈论x = 0-> 4
3)if语句是我感到困惑的地方。 “ integers”是参数,但是我们传递给它的参数是一个数组。 所以在我的脑海中,我看到[5,10,21,6,100] [x]> i。 因此,如果索引为1-> 4,它们都将仍然大于0。

let i = 0;

function findLargest (integers) {
  for (let x=0; x<integers.length; x++) {  
    if (integers[x] > i) {     
      i = integers[x];
    }
  }
  console.log(i);
}

findLargest([5, 10, 21, 6, 100]);          
//Output: 100 

没有什么意义? 这称为数组索引(通过指定索引从数组中获取值)。 语法为array[index]

所以,如果你有一个数组,说

 var arr = [10, 6, 15]

您可以通过访问它的第二个元素

arr[1] // 6

数组不需要存储在变量中。 数组是 (此外,它们是对象)。 因此[10, 6, 15][1]具有与上面示例完全相同的效果。

在您的情况下, integers[x]将是位置x处的元素。 使用0到长度-1循环是一种遍历数组的方法。 该函数遍历数组中的每个元素,并验证该元素是否大于找到的最后一个元素。 这样,它找到了最大的

注意:您拥有的算法并不完整,因为对于所有元素均小于0的数组,该算法将失败。在这种情况下,搜索不应从任意值(在您的情况下为0)开始,而应从的现有元素开始数组(通常是第一个)。 同样,多次调用该函数也会失败,因为变量x全局的,而不是函数的局部变量。 我建议删除代码的第一行,并在函数的开头添加新行:

 var i = integers[0]

更新 (OP编辑了问题之后)是的,它们都将大于0,但是您并不是 每次都在搜索大于0。 线

 i = integers[x]

将I的值更改为最初发现大于0的元素。 因此,下一次搜索将比该元素更大。 看起来像这样。 让我们看一下这个数组: [5, 7, 2, 12, 0]

5 > 0  (TRUE) => i = 5
7 > 5 (TRUE)  => i = 7
2 > 7 (FALSE)
12 > 7 (TRUE) => i = 12
0 > 12 (FALSE)

您可以使用带有索引的数组,然后转到每个值,然后检查并查看哪个值用于比较以及哪个值更改。

在循环中,您可以添加带有索引,两个要比较的值,比较结果和i的新值(如果更改)的console.log ,例如

console.log(x, array[x], i, array[x] > i, array[x] > i && array[x])
 [5, 10, 21, 6, 100][x] > i 

有价值观

 [5, 10, 21, 6, 100][0] > 0 5 > 0 -> i = 5 [5, 10, 21, 6, 100][1] > 10 10 > 5 -> i = 10 [5, 10, 21, 6, 100][2] > 21 21 > 10 -> i = 21 [5, 10, 21, 6, 100][3] > 6 6 > 21 [5, 10, 21, 6, 100][4] > 100 100 > 21 -> i = 100 

 function findLargest(integers) { var i = integers[0], // take the first element of the array x; for (x = 1; x < integers.length; x++) { // iterate from the second element console.log(x, integers[x], i, integers[x] > i, integers[x] > i && integers[x]); if (integers[x] > i) { i = integers[x]; } } return i; } console.log(findLargest([5, 10, 21, 6, 100])); 

您也可以使用reduce而不是循环。

function findLargest (integers) {
  if(integers.length===0){
    return;//return undefined for empty array since there is no lowest
  }
  return integers.reduce(
    function(highest,current){
      return (current>highest)
        ? current
        : highest
    }
  );;
};
findLargest([5, 10, 21, 6, 100]); 

对于许多可以通过reduce解决的过程,您还可以使用递归

function findLargest (integers) {
  var recur = function(highest,numbers){
    if(numbers.length===0){//processed all numbers, return highest
      return highest;
    }
    if(numbers[0]>highest){
      highest=numbers[0];
    }
    //call itself again with highest and numbers without the first element
    return recur(highest,numbers.slice(1));
  };
  //return recursive function recur
  return recur(integers[0],integers.slice(1));
};
findLargest([5, 10, 21, 6, 100]); 

这不是一种非常有效的方法,但是代码量最少(建议不要使用大型数组或使用较小数组多次调用的代码)。

这使用了称为sortmutator方法

function findLargest (integers) {
  //map integers so you have a copy of integers
  //  this because .sort is a mutator methods and will
  //  change integers if you don't copy it first
  return integers.map(x=>x).sort((a,b)=>a-b).slice(-1)[0];
};
findLargest([5, 10, 21, 6, 100]); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM