JavaScript中最大值最小值问题

来源:互联网 发布:07版excel编程入门教程 编辑:程序博客网 时间:2024/06/10 14:42

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

以下是自己写的:

有如下数字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'); //22getMaxMin(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');  //22getMaxMin(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参数,则过程如下:

  prev next index array returnValue first call 7 10.5 0 [10.5, 8.5, 22, 14.8] 10.5 second call 10.5 8.5 1 [10.5, 8.5, 22, 14.8] 10.5 third call 10.5 22 2 [10.5, 8.5, 22, 14.8] 22 fourth call 22 14.8 3 [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

原创粉丝点击