求数组的最大值和最小值

给定一个数组array求最大值和最小值:

1.一般做法:

算法1的主要思想是在自定义的min()函数和max()函数中,通过循环由第一个值依次与后面的值作比较,动态更新最大值和最小值,从而找到结果

// 最小值
Array.prototype.min = function() {
   var min = this[0];
   var len = this.length;
   for (var i = 1; i < len; i++){
        if (this[i] < min){
            min = this[i];
        }
   }
   return min;
};
//最大值
Array.prototype.max = function() {
   var max = this[0];
   var len = this.length;
   for (var i = 1; i < len; i++){
       if (this[i] > max) {
           max = this[i];
       }
   }
   return max;
};

 

2.借助Math对象的min()函数和max()函数

算法2的主要思想是通过apply()函数改变函数的执行体,将数组作为参数传递给apply()函数。这样数组就可以直接调用Math对象的min()函数和max()函数来获取返回值

// 最大值
Array.max = function(array) {
   return Math.max.apply(Math, array);
};
// 最小值
Array.min = function(array) {
   return Math.min.apply(Math, array);
};

 

3.优化上面做法:

在算法2中将min()函数和max()函数作为Array类型的静态函数,但并不支持链式调用,我们可以利用对象字面量进行简化。

// 最大值
Array.prototype.max = function() {
   return Math.max.apply({}, this);
};
// 最小值
Array.prototype.min = function() {
   return Math.min.apply({}, this);
};

上面的算法代码中apply()函数传入的第一个值为{},实际表示当前执行环境的全局对象。第二个参数this指向需要处理的数组。
由于apply()函数的特殊性,我们还可以得到其他几种实现方法。将apply()函数的第一个参数设置为null、undefined或{}都会得到相同的效果。

4. 借助Array类型的reduce()函数

主要思想是reduce()函数不设置initialValue初始值,将数组的第一个元素直接作为回调函数的第一个参数,依次与后面的值进行比较。当需要找最大值时,每轮累加器返回当前比较中大的值;当需要找最小值时,每轮累加器返回当前比较中小的值

// 最大值
Array.prototype.max = function () {
   return this.reduce(function (preValue, curValue) {
       return preValue > curValue ? preValue : curValue;  // 比较后,返回大的值
   });
};
// 最小值
Array.prototype.min = function () {
   return this.reduce(function (preValue, curValue) {
       return preValue > curValue ? curValue : preValue;  // 比较后,返回小的值
   });
};

5. 借助Array类型的sort()函数

主要思想是借助数组原生的sort()函数对数组进行排序,排序完成后首尾元素即是数组的最小、最大元素。
默认的sort()函数在排序时是按照字母顺序排序的,数字都会按照字符串处理,例如数字11会被当作"11"处理,数字8会被当作"8"处理。在排序时是按照字符串的每一位进行比较的,因为"1"比"8"要小,所以"11"在排序时要比"8"小。对于数值类型的数组来说,这显然是不合理的,所以需要我们自定义排序函数。

var sortFn = function (a, b) {
   return a - b;
 };
var arr5 = [2, 4, 10, 7, 5, 8, 6];
var sortArr = arr5.sort(sortFn);
// 最小值
console.log(sortArr[0]); // 2
// 最大值
console.log(sortArr[sortArr.length - 1]); // 10
得到数组的最小值为“2”,最大值为“10”。

6.借助ES6的扩展运算符

算法6的主要思想是借助于ES6中增加的扩展运算符(...),将数组直接通过Math.min()函数与Math.max()函数的调用,找出数组中的最大值和最小值。
根据以上的分析,得到以下的代码。
var arr6 = [2, 4, 10, 7, 5, 8, 6]
// 最小值
console.log(Math.min(...arr6));
// 最大值
console.log(Math.max(...arr6));
得到数组的最小值为“2”,最大值为“10”。
一共讲解了6种求数组中最大值和最小值的方法。实际运用时推荐算法3,如果追求代码的简洁,推荐算法6,不过它需要ES6提供支持。

posted @ 2021-07-12 09:20  鸡腿太小  阅读(4403)  评论(0编辑  收藏  举报