【问题标题】:JavaScript: greatest value in an arrayJavaScript:数组中的最大值
【发布时间】:2021-01-16 07:34:07
【问题描述】:

该函数仅在 first (arr[0])last index ( arr[arr.length-1]) 的数组。如何修复逻辑错误?

function isGreater(arr) {
 let a = arr[0];
 for (let i = 0; i < arr.length; i++) {
  var isGreat = (a < arr[i]) ? arr[i] : a;
 }
 return isGreat;
}
console.log(isGreater([7, 9, 10000, 11, 25, 20]));
// output=> 20, expected output 10000
console.log(isGreater([7, 11, 25, 2]));
// output=> 7, expected output 25

【问题讨论】:

  • 试试Math.max.apply(null, [7, 9, 10000, 11, 25, 20])
  • Math.max.apply(null, [7, 9, 10000, 11, 25, 20]) 但无论如何,你需要有一个变量,在循环之前设置为 0,在每个循环中设置为自身或当前数组元素中的较大者。
  • 这能回答你的问题吗? Finding largest integer in an array in JavaScript
  • 我认为使用扩展运算符比使用Function.prototype.apply 更干净。在这种情况下,Math.max(...[7, 9, 10000, 11, 25, 20]) 最终,浏览器之间的性能会有所不同,并且两者都可能导致大型数组的堆栈溢出,因此这确实是个人喜好问题。

标签: javascript arrays logic


【解决方案1】:

逻辑错误是您将arr[i]a 分配给isGreat,但从未将isGreatarr[i] 进行比较。

只需重复使用a,而不是使用isGreat

function isGreater(arr) {
    let a = arr[0];
    for (let i = 1; i < arr.length; i++) {
        a = a < arr[i] ? arr[i] : a;
    }
    return a;
}
console.log(isGreater([7, 9, 10000, 11, 25, 20]));
console.log(isGreater([7, 11, 25, 2]));

请注意,我更新它以跳过循环中的第一个索引,因为 a 已经包含该值。

这一行:

a = a < arr[i] ? arr[i] : a;

如果您愿意,可以这样:

if (a < arr[i]) {
    a = arr[i];
}

我认为这是一个练习。如果没有,您可以像这样更直接地获得结果:

// ES2015+
function isGreater(arr) {
    return Math.max(...arr);
}

或者这个:

// ES5 and earlier
function isGreater(arr) {
    return Math.max.apply(Math, arr);
}

【讨论】:

    【解决方案2】:

    您需要将数组的第一个值作为实际最大值并从索引1 开始循环。不需要a,对数组的另一个引用。

    在循环内部检查isGreat是否小于实际值并更新isGreat

    该检查可防止对旧的和新的最大值进行多余的分配。

    function isGreater(arr) {
        let isGreat = arr[0];
        for (let i = 1; i < arr.length; i++) {
            if (isGreat < arr[i]) {
                isGreat = arr[i];
            }
        }
        return isGreat;
    }
    
    console.log(isGreater([7, 9, 10000, 11, 25, 20])); // 10000
    console.log(isGreater([7, 11, 25, 2]));            //    25

    【讨论】:

      【解决方案3】:

      你应该这样做:

      function fun(){
         let arr = [7, 9, 10000, 11, 25, 20];
       let a = arr[0];
       for (let i = 0; i < arr.length; i++) {
        a = (a < arr[i]) ? arr[i] : a;
       }
       return a; //Returns 10000
      }
      

      【讨论】:

        【解决方案4】:

        首先,您在循环内定义了isGreat,因此每次迭代都会重新定义它。试试这个:

        function isGreater(arr){
               let greatest = arr[0];
               for(let i = 0; i < arr.length; i++){
                  if(arr[i] > greatest){
                    greatest = arr[i];
                  }
               }
               return greatest;
        }
            
        console.log(isGreater([0, 4, 6, 1, 3]))

        【讨论】:

          【解决方案5】:

          当您找到最大值时,您应该尝试将当前值与当前最大值进行比较,以便在迭代过程中最大的值会发生变化。

          这是一个例子

          function isGreater(arr) {
            let greatest = arr[0];
            for (let i = 1; i < arr.length; i++) {
              greatest = greatest < arr[i] ? arr[i] : greatest;
            }
            return greatest;
          }
          

          【讨论】:

            【解决方案6】:

            尽管您可能已经有了更好的答案,但我是这样做的:

            const isGreater = arr => {
                return arr.sort((a, b) => b - a)[0];
            };
            

            这只是对数组进行降序排序,并返回新排序数组的第一个元素。

            【讨论】:

              猜你喜欢
              • 2017-01-10
              • 2017-12-20
              • 2016-06-21
              • 2017-01-13
              • 2011-09-03
              • 1970-01-01
              • 2015-04-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多