zoukankan      html  css  js  c++  java
  • js获取数字数组最大值的几种方式

    原生Math.max方法

    Math.max 方法不能接收数组,可以使用ES6的...将数组打散

    const arr = [111, 12, 111, 34, 2, 5, 76];
    console.log(Math.max(...arr));
    

    当然也可以用apply方法调用

    console.log(Math.max.apply(null, arr));
    

    遍历获取最大值

    遍历数组,依次比较,保存较大的数,最终得到的就是最大值,这里使用forEach遍历

    function max2(arr) {
        let result = -Infinity;
        arr.forEach((item) => {
            if (item > result) {
                result = item;
            } 
        });
        return result;
    }
    console.log(max2(arr));
    

    利用排序获取最大值

    将数组使用sort方法排序后,第一个元素或最后一个元素就是最大值,再用shift或者pop方法取出(由升序还是降序决定),值得注意的是这两个方法会修改原数组,可以使用slice方法复制一份数组再执行弹出元素操作

    function max3(arr) {
        return arr.sort((a, b) => a - b).slice().pop();
    }
    console.log(max3(arr));
    

    使用filter排除小的值

    使用filter函数依次取出<自身的元素,当取不出元素即返回的函数长度===零时,就取得了最大值,至于为什么用递归不用循环,用IIFE不用先声明后使用,嗯,就是单纯的不想

    (function greater(arr, idx) {
        const res = arr.filter(item => item > arr[idx]);
        if (res.length === 1) {
            console.log(res[0]);
            return res[0];
        }
        greater(arr, idx + 1);
    })(arr, 0);
    

    使用every判断自己是否是最大值

    使用every的原理和使用filter的原理类似,即当所有元素都<=本身的时候,本身就是最大值

    (function greater(arr, idx) {
        if (arr.every(item => item <= arr[idx])) {
            console.log(arr[idx]);
            return arr[idx];
        }
        greater(arr, idx + 1);
    })(arr, 0);
    

    使用递归模拟数组方法

    和上面两个方法类似,只是内层用了递归和IIFE模拟every

    (function outer(arr, i) {
        let flag = function inner(arr, j) {
            if (arr[j] <= arr[i]) {
                return false;
            }
            return arr.length < j + 1 ? inner(arr, j + 1) : true;
        }(arr, 0);
        if (flag) {
            console.log(arr[i - 1]);
            return arr[i - 1];
        }
        outer(arr, i + 1);
    })(arr, 0);
    

    友情提示

    前面几种方法相对比较简洁,工作中比较常用,后边三种比较适合身子骨比较硬、头比较铁的码农仅供学习、娱乐,切莫当真(狗头保命)。

  • 相关阅读:
    编译原理三大经典书籍
    c#之委托总结
    shell编程基础
    专家是什么?我真的想知道(转)
    linux sed
    判断一个脚本中的变量是否为空(转)
    JAVA Stack栈和Heap堆的区别(转)
    CMD获取当前目录的绝对路径 (转)
    RTP协议分析
    VS2010旗舰版安装图解
  • 原文地址:https://www.cnblogs.com/hycstar/p/14432618.html
Copyright © 2011-2022 走看看