JavaScript学习:取数组中最大值和最小值
在实际业务中有的时候要取出数组中的最大值或最小值。但在数组中并没有提供arr.max()
和arr.min()
这样的方法。那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法。
取数组中最大值
可以先把思路理一下:
- 将数组中第一个元素赋值给一个变量,并且把这个变量作为最大值;
- 开始遍历数组,从第二个元素开始依次和第一个元素进行比较
- 如果当前的元素大于当前的最大值,就把当前的元素值赋值给最大值
- 移动到下一个元素,继续按前面一步操作
- 当数组元素遍历结束时,这个变量存储的就是最大值
代码如下:
1 Array.prototype.max = function () { 2 // 将数组第一个元素的值赋给max 3 var max = this[0]; 4 // 使用for 循环从数组第一个值开始做遍历 5 for (var i = 1; i < this.length; i++) { 6 // 如果元素当前值大于max,就把这个当前值赋值给max 7 if (this[i] > max) { 8 max = this[i]; 9 } 10 } 11 // 返回最大的值 12 return max; 13 }
来看一个示例:
1 var arr = [1,45,23,3,6,2,7,234,56]; 2 arr.max(); // 234
上面的示例,数组中都是数值,那么如果数组中不全是数值会是一个什么样的效果呢?来测试一下先:
1 var arr = [1,45,23,3,6,2,7,234,56,'2345','a','c']; 2 arr.max(); // 'c'
这并不是我们想要的结果吧。
通过前段时间的学习,都知道for
循环性能要比forEach()
差,那可以将上面的方法改成forEach()
方法:
1 Array.prototype.max = function (){ 2 var max = this[0]; 3 this.forEach (function(ele,index,arr){ 4 if(ele > max) { 5 max = ele; 6 } 7 }) 8 return max; 9 } 10 var arr = [1,45,23,3,6,2,7,234,56]; 11 arr.max(); // 234
取数组中最小值
类似取最大值的思路一样,我们可以很轻松的实现 arr.min() 方法,取出数组中的最小值:
1 Array.prototype.min = function () { 2 var min = this[0]; 3 this.forEach(function(ele, index,arr) { 4 if(ele < min) { 5 min = ele; 6 } 7 }) 8 return min; 9 } 10 11 var arr = [1,45,23,3,6,2,7,234,56]; 12 arr.min(); // 1
其他方法
除了上面的方案,还可以有其他方法,比如使用数组的 reduce() 方法。回忆前面的学过的知识,reduce()
方法可以接收一个回调函数 callbackfn ,可以在这个回调函数中拿数组中的初始值 (preValue) 与数组中当前被处理的数组项 (curValue) 做比较,如果 preValue 大于 curValue 值返回 preValue ,反之返回 curValue 值,依此类推取出数组中最大值:
1 Array.prototype.max = function() { 2 return this.reduce(function(preValue, curValue,index,array) { 3 return preValue > curValue ? preValue : curValue; 4 }) 5 } 6 var arr = [1,45,23,3,6,2,7,234,56]; 7 arr.max(); // 234
同样的也可以使用类似的方法实现 arr.mix() 方法,取出数组中的最小值:
1 Array.prototype.min = function() { 2 return this.reduce(function(preValue, curValue,index,array) { 3 return preValue > curValue ? curValue : preValue; 4 }) 5 } 6 var arr = [1,45,23,3,6,2,7,234,56]; 7 arr.min(); // 1
内置函数Math.max()
和Math.min()
方法
对于纯数字数组,可以使用JavaScript中的内置函数 Math.max() 和 Math.min() 方法。使用这两个内置函数可以分别找出数组中的最大值和最上值。在使用这两种内置函数取出数组最大和最小值之前,先学习一下 Math.max() 和 Math.min() 两个函数。
Math.max()
Math.max() 函数返回一组数中的最大值。
1 Math.max(1,32,45,31,3442,4); // 3442 2 Math.max(10, 20); // 20 3 Math.max(-10, -20); // -10 4 Math.max(-10, 20); // 20
Math.min()
Math.min() 函数和 Math.max() 函数刚好相反,其会返回一组数中的最小值:
1 Math.min(10,20); //10 2 Math.min(-10,-20); //-20 3 Math.min(-10,20); //-10 4 Math.min(1,32,45,31,3442,4); //1
这些函数如果没有参数,则结果为 -Infinity
;如果有任一参数不能被转换为数值,则结果为 NaN
。最主要的是这两个函数对于数字组成的数组是不能直接使用的。但是,这有一些类似地方法。
Function.prototype.apply() 让你可以使用提供的 this 与参数组与的数组来调用参数。
1 // 取出数组中最大值 2 Array.max = function( array ){ 3 return Math.max.apply( Math, array ); 4 }; 5 // 取出数组中最小值 6 Array.min = function( array ){ 7 return Math.min.apply( Math, array ); 8 }; 9 10 var arr = [1,45,23,3,6,2,7,234,56]; 11 Array.max(arr); // 234 12 Array.min(arr); // 1
Math
对象也是一个对象,可以使用对象的字面量来写,如:
1 Array.prototype.max = function () { 2 return Math.max.apply({},this); 3 } 4 Array.prototype.min = function () { 5 return Math.min.apply({},this); 6 } 7 var arr = [1,45,23,3,6,2,7,234,56]; 8 arr.max(); // 234 9 arr.min(); // 1
其实还有更简单的方法。基于ES2015的方法来实现此功能,是使用展开运算符:
1 var numbers = [1, 2, 3, 4]; 2 Math.max(...numbers) // 4 3 Math.min(...numbers) // 1
此运算符使数组中的值在函数调用的位置展开。
总结
这篇文章整理了几个从数组中取出最大值和最小值的方法。这几个方法都只是会对于数字数组,而对于数组中包含其他数据类型时,如何只取出最大的数值和最小的数值(如果您知道如何实现,还望指点迷津)。而这几种方法当中,使用JavaScript的内置函数Math.max()
和Math.min()
配合Function.prototype.apply()
可以轻松取出数组中的最大值和最小值。当然最最简单的要当数ES2015中使用展示运算符的方法。如果大家还有更好的方案,希望能在下面的评论中与我们一起分享