【问题标题】:JavaScript: if statement inside for loop (finding largest number from array)JavaScript:for循环中的if语句(从数组中查找最大数)
【发布时间】:2018-02-04 08:54:58
【问题描述】:

我无法理解这段代码如何从一组数字中找到最大的数字。这是我目前所理解的:

1) 声明变量 i,并将其赋值为 0。
2) for 循环:x 从 0 开始,但会随着 x 4
3) if 语句是我感到困惑的地方。 “整数”是参数,但我们传递给它的参数是一个数组。所以在我的脑海中,我看到 [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 

【问题讨论】:

  • “我知道这毫无意义” — 那么您将如何通过索引访问数组?
  • integers[x] 表示:integers 的元素在位置 x
  • 使用browser console (dev tools)(点击F12)。在你的代码中使用console.log(integers[x]) 之类的东西,或者直接输入例如[5, 10, 21, 6, 100][2] 在控制台中。它可以为您提供帮助。

标签: javascript arrays for-loop if-statement nested-loops


【解决方案1】:

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

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

 var arr = [10, 6, 15]

您可以通过

访问它的第二个元素
arr[1] // 6

数组不需要存储在变量中。数组是(此外,它们是对象)。所以[10, 6, 15][1]的效果和上面的例子完全一样。

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

注意:您拥有的算法并不完整,因为对于所有元素都小于 0 的数组,它将失败。在这种情况下,搜索不应从任意值开始(在您的case 0),但来自数组的现有元素(通常是第一个元素)。此外,多次调用该函数会失败,因为变量 xglobal 而不是该函数的本地变量。我建议删除代码的第一行并在函数开头添加新行:

 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)

【讨论】:

  • OHHHH,哇,非常感谢,我现在完全明白了!我忘了认为每个元素都会先遍历整个代码。再次感谢您!
【解决方案2】:

您可以获取带有索引的数组并转到每个值并检查并查看哪个值用于比较以及哪个值发生了变化。

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

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]));

【讨论】:

  • copuld ...你应该明确地输入慢;)
【解决方案3】:

您也可以使用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解决的流程,您也可以使用recursion

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 method

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]); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多