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 相关文章推荐
Extjs gridpanel 出现横向滚动条问题的解决方法
Jul 04 Javascript
xmlhttp缓存清除的2种解决方法
Dec 13 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
Dec 04 Javascript
vue上传图片组件编写代码
Jul 26 Javascript
vue-router 导航钩子的具体使用方法
Aug 31 Javascript
原生JS控制多个滚动条同步跟随滚动效果
Dec 22 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
Jul 31 Javascript
layui数据表格跨行自动合并的例子
Sep 02 Javascript
Vue常用的全选/反选的示例代码
Feb 19 Javascript
React实现类似淘宝tab居中切换效果的示例代码
Jun 02 Javascript
vue 内联样式style中的background用法说明
Aug 05 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
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
javascript实现动态标签云
2015/10/16 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
python关于调用函数外的变量实例
2019/12/26 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
GWT都有什么特性
2016/12/02 面试题
广告学专业应届生求职信
2013/10/01 职场文书
肯尼迪就职演说稿
2013/12/31 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
奖励通知
2015/04/22 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers