JavaScript中最大值最小值问题

最近碰到了一个比较最大值的问题,想了一些时间,虽说自己弄出来了,但是方法还是不太好用。觉得应该还有其它方法。因此在网上也看了一些文章,现在做一些整理总结。

以下是自己写的:

有如下数字10, 8.5, 14.8, 22,从中找出最大值。

var arr = [10.5, 8.5, 22, 14.8];
function maxValue(arr) {
    arr.sort(function(a,b) {
        return parseFloat(b) - parseFloat(a); //sort()方法默认返回的是字符串,此处通过类型转换为数字
    });
    return arr.slice(arr.length - 1, arr.length); //获取
}
console.log(maxValue(arr));

当然,也可以用排序算法得到一个数组,再取最值,不过比较麻烦。
这里只能进行求最大值,进一步封装一下:

function getMaxMin(arr, maxmin) {
    arr.sort(function(a,b) {
        return parseFloat(a) - parseFloat(b);
    });
    if(maxmin == 'min') {
        return arr.slice(0, 1); 
        //或者
        //return arr[0];    
    }
    else if(maxmin == 'max') {
        return arr.slice(arr.length - 1, arr.length);
        //或者
        return arr[arr.length - 1]; 
    }
}
getMaxMin(arr, 'max'); //22
getMaxMin(arr, 'min'); //8.5

以下来源与网络,整理如下:

方法一:Math的max和min方法

一维数组:
var arr = [10.5, 8.5, 22, 14.8];
Math.mix.apply(null,arr); //8.5

二维数组:

var arr2 = [1, 2, 3, [6, 5, 4], 1];
var newArr = arr2.join(',').split(',');
Math.min.apply(null, newArr); //1

方法二: 假设法

假定第一个为最小
然后比较,如果比第一个小,就交换值
最后返回最小的那一个

var arr = new Array(10.5, 8.5, 22, 14.8);
// 如果你是引入类库进行开发,害怕类库也实现了同名的原型方法,可以在生成函数之前进行重名判断
if(typeof Array.prototype['min'] == 'undefined') {
    Array.prototype.min = function() {
        var min = this[0];
        var len = this.length;
        for(var i = 0; i < len; i++) {
        if(this[i] < min) {
            min = this[i];
            }
        }
        return min;
    }
}
arr.min(); //8.5

看到类似的方法(来自于segmentfault,链接在最后),有人将代码精简了,没想到还能这样用!用的是三目运算符,我整理一下,封装后函数如下:

function getMaxMin(arr) {
    var min = arr[0], max = arr[0];
    for(var i = 0; i < arr.length; i++) {
        max = max > arr[i] ? max : arr[i];
        min = min < arr[i] ? min : arr[i];
    }
    console.log('max is: ' + max + '; min is : ' + min);
}
var arr = [10.5, 8.5, 22, 14.8];
getMaxMin(arr); //max is: 22; min is : 8.5

还有类似的,不过理解起来可能会有点难度,但是思路还是一致的,如下:

function maxValue(arr) {
    for(var i = 0; i < arr.length; i++) {
        var max = arr[0]; //这是我添加的,方便理解,后面的arr[0]替换成max。
        if(max < arr[i]) {
            max = arr[i];
        }
    }
    return max;
}
var arr = [10.5, 8.5, 22, 14.8];
maxValue(arr); //22

类似的,另外一种是调用Math.max()方法

function getMax(arr) {
    var max = arr[0]
    for(var i = 1; i < arr.length; i++) {
        max = Math.max(max, arr[i]);
    }
    return max;
}
var arr = [10.5, 8.5, 22, 14.8];
getMax(arr);

方法三:Math.max()、Math.min()、apply

// 用Math.max和Math.min方法可以迅速得到结果。
// apply能让一个方法指定调用对象与传入参数,并且传入参数是以数组形式组织的。恰恰现在有一个方法叫Math.max,调用对象为Math,与多个参数

var arr = [10.5, 8.5, 22, 14.8];
Array.min = function(array) {
    return Math.min.apply(Math, array);
};
arr.min(); //8.5

// 但是,John Resig是把它们做成Math对象的静态方法,不能使用大神最爱用的链式调用了。但这方法还能更精简一些,不要忘记,Math对象也是一个对象,我们用对象的字面量来写,又可以省几个比特了。
Array.prototype.min = function() {
    return Math.min.apply({}, this);
}

将以上最大最小值方法进行封装,可得如下:

function getMaxMin(arr, maxmin) {
    if(maxmin == 'max') {
        return Math.max.apply(Math, arr);
    }
    else if(maxmin == 'min'){
        return Math.min.apply(Math, arr);
    }
}
var arr = [10.5, 8.5, 22, 14.8];
getMaxMin(arr, 'max');  //22
getMaxMin(arr, 'min');  //8.5

方法四:reduce()

function maxValue(prev, next) {
    return Math.max(prev, next);
}
var arr = [10.5, 8.5, 22, 14.8];
arr.reduce(maxValue); //22

这个reduce()方法不太好理解,语法如下:
array.reduce(function(prev, cur,index, array), initialValue);
prev:必需 初始值(或计算结束后的返回值)
cur:必需 当前元素
index:可选的 当前元素的索引
array:可选的 当前元素所属的数组对象
initialValue:可选的,作为归并基础初始值
注意: reduce() 对于空数组是不会执行回调函数的。

第一次执行回调函数 prev是10.5,next是8.5, 返回值是10.5。
第二次执行回调函数 prev是10.5,next是22, 返回值是22。
第三次执行回调函数 prev是22,next是14.8, 返回值是22。
 
 
 
假设有initialValue = 7;且有index,array参数,则过程如下:

 prevnextindexarrayreturnValue
first call710.50[10.5, 8.5, 22, 14.8]10.5
second call10.58.51[10.5, 8.5, 22, 14.8]10.5
third call10.5222[10.5, 8.5, 22, 14.8]22
fourth call2214.83[10.5, 8.5, 22, 14.8]22

第一次执行回调函数 prev是7,next是10.5,返回值是10.5;
第一次执行回调函数 prev是10.5,next是8.5, 返回值是10.5;
第二次执行回调函数 prev是10.5,next是22, 返回值是22;
第三次执行回调函数 prev是22,next是14.8, 返回值是22。


参考文章:
1. Javascript获取数组中的最大值和最小值的方法汇总
2. js判断数组最大值的原理是什么求解?
3. JavaScript专题之如何求数组的最大值和最小值
4. 详解JavaScript中数组的reduce方法


EOF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值