JavaScript学习笔记之取数组中最大值和最小值


Posted in Javascript onMarch 23, 2016

推荐阅读:JavaScript学习笔记之数组的增、删、改、查

在实际业务中有的时候要取出数组中的最大值或最小值。但在数组中并没有提供arr.max()和arr.min()这样的方法。那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法。

取数组中最大值

可以先把思路理一下:

将数组中第一个元素赋值给一个变量,并且把这个变量作为最大值;

开始遍历数组,从第二个元素开始依次和第一个元素进行比较

如果当前的元素大于当前的最大值,就把当前的元素值赋值给最大值

移动到下一个元素,继续按前面一步操作

当数组元素遍历结束时,这个变量存储的就是最大值

代码如下:

Array.prototype.max = function () {
// 将数组第一个元素的值赋给max
var max = this[0];
// 使用for 循环从数组第一个值开始做遍历
for (var i = 1; i < this.length; i++) {
// 如果元素当前值大于max,就把这个当前值赋值给max
if (this[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 < min) {
min = ele;
}
})
return min;
}
var arr = [1,45,23,3,6,2,7,234,56];
arr.min(); // 1

其他方法

除了上面的方案,还可以有其他方法,比如使用数组的reduce()方法。回忆前面的学过的知识,reduce()方法可以接收一个回调函数callbackfn,可以在这个回调函数中拿数组中的初始值(preValue)与数组中当前被处理的数组项(curValue)做比较,如果preValue大于curValue值返回preValue,反之返回curValue值,依此类推取出数组中最大值:

Array.prototype.max = function() {
return this.reduce(function(preValue, curValue,index,array) {
return preValue > 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); // 3442
Math.max(10, 20); // 20
Math.max(-10, -20); // -10
Math.max(-10, 20); // 20

Math.min()

Math.min()函数和Math.max()函数刚好相反,其会返回一组数中的最小值:

Math.min(10,20); //10
Math.min(-10,-20); //-20
Math.min(-10,20); //-10
Math.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); // 234
Array.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(); // 234
arr.min(); // 1

其实还有更简单的方法。基于ES2015的方法来实现此功能,是使用展开运算符:

var numbers = [1, 2, 3, 4];
Math.max(...numbers) // 4
Math.min(...numbers) // 1

此运算符使数组中的值在函数调用的位置展开。

总结

这篇文章整理了几个从数组中取出最大值和最小值的方法。这几个方法都只是会对于数字数组,而对于数组中包含其他数据类型时,如何只取出最大的数值和最小的数值(如果您知道如何实现,还望指点迷津)。而这几种方法当中,使用JavaScript的内置函数Math.max()和Math.min()配合Function.prototype.apply()可以轻松取出数组中的最大值和最小值。当然最最简单的要当数ES2015中使用展示运算符的方法。

关于JavaScript学习笔记之取数组中最大值和最小值的方法就给大家介绍这么多,如果大家还有更好的方案,希望能在下面的评论中与我们一起分享。

Javascript 相关文章推荐
为jQuery增加join方法的实现代码
Nov 28 Javascript
一些常用的JavaScript函数(json)附详细说明
May 25 Javascript
javascript中判断一个值是否在数组中并没有直接使用
Dec 17 Javascript
js快速排序的实现代码
Dec 08 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
Jan 04 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
Aug 03 Javascript
原生JS实现的简单轮播图功能【适合新手】
Aug 17 Javascript
JavaScript学习笔记之DOM基础操作实例小结
Jan 09 Javascript
小程序云开发如何实现图片上传及发表文字
May 17 Javascript
Vue中遍历数组的新方法实例详解
Jul 21 Javascript
初学vue出现空格警告的原因及其解决方案
Oct 31 Javascript
JavaScript学习笔记之数组去重
Mar 23 #Javascript
JavaScript学习笔记之数组随机排序
Mar 23 #Javascript
JavaScript学习笔记之数组求和方法
Mar 23 #Javascript
JavaScript学习笔记之数组的增、删、改、查
Mar 23 #Javascript
高效利用Angular中内置服务$http、$location等
Mar 22 #Javascript
BootStrap实用代码片段之一
Mar 22 #Javascript
Javascript中的几种继承方式对比分析
Mar 22 #Javascript
You might like
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
php查看当前Session的ID实例
2015/03/16 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
vue实现购物车列表
2020/06/30 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
js实现抽奖功能
2020/11/24 Javascript
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
Python for循环中的陷阱详解
2018/07/13 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
基于Python fminunc 的替代方法
2020/02/29 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
放假通知格式
2015/04/14 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS
js实现模拟购物商城案例
2021/05/18 Javascript