在实际业务中有的时候要取出数组中的最大值或最小值。但在数组中并没有提供 arr.max() 和 arr.min() 这样的方法。那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法。
取数组中最大值 可以先把思路理一下:
将数组中第一个元素赋值给一个变量,并且把这个变量作为最大值; 开始遍历数组,从第二个元素开始依次和第一个元素进行比较 如果当前的元素大于当前的最大值,就把当前的元素值赋值给最大值 移动到下一个元素,继续按前面一步操作 当数组元素遍历结束时,这个变量存储的就是最大值 代码如下:
array.prototype.max = function () { // 将数组第一个元素的值赋给max var max = this[0]; // 使用for 循环从数组第一个值开始做遍历 for (var i = 1; i max) { max = this[i]; } } // 返回最大的值 return max;}
来看一个示例:
var arr = [1,45,23,3,6,2,7,234,56];arr.max(); // 234
上面的示例,数组中都是数值,那么如果数组中不全是数值会是一个什么样的效果呢?来测试一下先:
var arr = [1,45,23,3,6,2,7,234,56,'2345','a','c'];arr.max(); // 'c'
这并不是我们想要的结果吧。( 此处跪求解决方案 )
通过前段时间的学习,都知道 for 循环性能要比 foreach() 差,那可以将上面的方法改成 foreach() 方法:
array.prototype.max = function (){ var max = this[0]; this.foreach (function(ele,index,arr){ if(ele > max) { max = ele; } }) return max;}var arr = [1,45,23,3,6,2,7,234,56];arr.max(); // 234
取数组中最小值 类似取最大值的思路一样,我们可以很轻松的实现 arr.min() 方法,取出数组中的最小值:
array.prototype.min = function () { var min = this[0]; this.foreach(function(ele, index,arr) { if(ele curvalue ? prevalue : curvalue; })}var arr = [1,45,23,3,6,2,7,234,56];arr.max(); // 234
同样的也可以使用类似的方法实现 arr.mix() 方法,取出数组中的最小值:
array.prototype.min = function() { return this.reduce(function(prevalue, curvalue,index,array) { return prevalue > curvalue ? curvalue : prevalue; })}var arr = [1,45,23,3,6,2,7,234,56];arr.min(); // 1
内置函数 math.max() 和 math.min() 方法 对于纯数字数组,可以使用javascript中的内置函数 math.max() 和 math.min() 方法。使用这两个内置函数可以分别找出数组中的最大值和最上值。在使用这两种内置函数取出数组最大和最小值之前,先学习一下 math.max() 和 math.min() 两个函数。
math.max() math.max() 函数返回一组数中的最大值。
math.max(1,32,45,31,3442,4); // 3442math.max(10, 20); // 20math.max(-10, -20); // -10math.max(-10, 20); // 20
math.min() math.min() 函数和 math.max() 函数刚好相反,其会返回一组数中的最小值:
math.min(10,20); //10math.min(-10,-20); //-20math.min(-10,20); //-10math.min(1,32,45,31,3442,4); //1
这些函数如果没有参数,则结果为 -infinity ;如果有任一参数不能被转换为数值,则结果为 nan 。最主要的是这两个函数对于数字组成的数组是不能直接使用的。但是,这有一些类似地方法。
function.prototype.apply()让你可以使用提供的this与参数组与的数组来调用参数。 // 取出数组中最大值array.max = function( array ){ return math.max.apply( math, array );}; // 取出数组中最小值array.min = function( array ){ return math.min.apply( math, array );};var arr = [1,45,23,3,6,2,7,234,56];array.max(arr); // 234array.min(arr); // 1
math 对象也是一个对象,可以使用对象的字面量来写,如:
array.prototype.max = function () { return math.max.apply({},this);}array.prototype.min = function () { return math.min.apply({},this);}var arr = [1,45,23,3,6,2,7,234,56];arr.max(); // 234arr.min(); // 1
其实还有更简单的方法。基于es2015的方法来实现此功能,是使用 展开运算符 :
var numbers = [1, 2, 3, 4];math.max(...numbers) // 4math.min(...numbers) // 1
此运算符使数组中的值在函数调用的位置展开。
总结 这篇文章整理了几个从数组中取出最大值和最小值的方法。这几个方法都只是会对于数字数组,而对于数组中包含其他数据类型时,如何只取出最大的数值和最小的数值(如果您知道如何实现,还望指点迷津)。而这几种方法当中,使用javascript的内置函数 math.max() 和 math.min() 配合 function.prototype.apply() 可以轻松取出数组中的最大值和最小值。当然最最简单的要当数es2015中使用展示运算符的方法。如果大家还有更好的方案,希望能在下面的评论中与我们一起分享。
参考资料 数组取最大值与最小值 javascript: min & max array values? 计算数组中的最大值/最小值 初学者学习笔记,如有不对,还希望高手指点。如有造成误解,还希望多多谅解。
大漠 常用昵称“大漠”,w3cplus创始人,目前就职于手淘。中国drupal社区核心成员之一。对html5、css3和sass等前端脚本语言有非常深入的认识和丰富的实践经验,尤其专注对css3的研究,是国内最早研究和使用css3技术的一批人。css3、sass和drupal中国布道者。2014年出版《 图解css3:核心技术与案例实战 》。
