JavaScript中最大值最小值问题
来源:互联网 发布:07版excel编程入门教程 编辑:程序博客网 时间:2024/06/10 14:42
最近碰到了一个比较最大值的问题,想了一些时间,虽说自己弄出来了,但是方法还是不太好用。觉得应该还有其它方法。因此在网上也看了一些文章,现在做一些整理总结。
以下是自己写的:
有如下数字10, 8.5, 14.8, 22,从中找出最大值。
var arr = [10.5, 8.5, 22, 14.8];function maxValue(arr) { arr.sort(function(a,b) { return parseFloat(b) - parseFloat(a); //sort()方法默认返回的是字符串,此处通过类型转换为数字 }); return arr.slice(arr.length - 1, arr.length); //获取}console.log(maxValue(arr));
当然,也可以用排序算法得到一个数组,再取最值,不过比较麻烦。
这里只能进行求最大值,进一步封装一下:
function getMaxMin(arr, maxmin) { arr.sort(function(a,b) { return parseFloat(a) - parseFloat(b); }); if(maxmin == 'min') { return arr.slice(0, 1); //或者 //return arr[0]; } else if(maxmin == 'max') { return arr.slice(arr.length - 1, arr.length); //或者 return arr[arr.length - 1]; }}getMaxMin(arr, 'max'); //22getMaxMin(arr, 'min'); //8.5
以下来源与网络,整理如下:
方法一:Math的max和min方法
一维数组:var arr = [10.5, 8.5, 22, 14.8];Math.mix.apply(null,arr); //8.5二维数组:var arr2 = [1, 2, 3, [6, 5, 4], 1];var newArr = arr2.join(',').split(',');Math.min.apply(null, newArr); //1
方法二: 假设法
假定第一个为最小
然后比较,如果比第一个小,就交换值
最后返回最小的那一个
var arr = new Array(10.5, 8.5, 22, 14.8);// 如果你是引入类库进行开发,害怕类库也实现了同名的原型方法,可以在生成函数之前进行重名判断if(typeof Array.prototype['min'] == 'undefined') { Array.prototype.min = function() { var min = this[0]; var len = this.length; for(var i = 0; i < len; i++) { if(this[i] < min) { min = this[i]; } } return min; }}arr.min(); //8.5
看到类似的方法(来自于segmentfault,链接在最后),有人将代码精简了,没想到还能这样用!用的是三目运算符,我整理一下,封装后函数如下:
function getMaxMin(arr) { var min = arr[0], max = arr[0]; for(var i = 0; i < arr.length; i++) { max = max > arr[i] ? max : arr[i]; min = min < arr[i] ? min : arr[i]; } console.log('max is: ' + max + '; min is : ' + min);}var arr = [10.5, 8.5, 22, 14.8];getMaxMin(arr); //max is: 22; min is : 8.5
还有类似的,不过理解起来可能会有点难度,但是思路还是一致的,如下:
function maxValue(arr) { for(var i = 0; i < arr.length; i++) { var max = arr[0]; //这是我添加的,方便理解,后面的arr[0]替换成max。 if(max < arr[i]) { max = arr[i]; } } return max;}var arr = [10.5, 8.5, 22, 14.8];maxValue(arr); //22
类似的,另外一种是调用Math.max()方法
function getMax(arr) { var max = arr[0] for(var i = 1; i < arr.length; i++) { max = Math.max(max, arr[i]); } return max;}var arr = [10.5, 8.5, 22, 14.8];getMax(arr);
方法三:Math.max()、Math.min()、apply
// 用Math.max和Math.min方法可以迅速得到结果。// apply能让一个方法指定调用对象与传入参数,并且传入参数是以数组形式组织的。恰恰现在有一个方法叫Math.max,调用对象为Math,与多个参数var arr = [10.5, 8.5, 22, 14.8];Array.min = function(array) { return Math.min.apply(Math, array);};arr.min(); //8.5// 但是,John Resig是把它们做成Math对象的静态方法,不能使用大神最爱用的链式调用了。但这方法还能更精简一些,不要忘记,Math对象也是一个对象,我们用对象的字面量来写,又可以省几个比特了。Array.prototype.min = function() { return Math.min.apply({}, this);}
将以上最大最小值方法进行封装,可得如下:
function getMaxMin(arr, maxmin) { if(maxmin == 'max') { return Math.max.apply(Math, arr); } else if(maxmin == 'min'){ return Math.min.apply(Math, arr); }}var arr = [10.5, 8.5, 22, 14.8];getMaxMin(arr, 'max'); //22getMaxMin(arr, 'min'); //8.5
方法四:reduce()
function maxValue(prev, next) { return Math.max(prev, next);}var arr = [10.5, 8.5, 22, 14.8];arr.reduce(maxValue); //22
这个reduce()方法不太好理解,语法如下:
array.reduce(function(prev, cur,index, array), initialValue);
prev:必需 初始值(或计算结束后的返回值)
cur:必需 当前元素
index:可选的 当前元素的索引
array:可选的 当前元素所属的数组对象
initialValue:可选的,作为归并基础初始值
注意: reduce() 对于空数组是不会执行回调函数的。
第一次执行回调函数 prev是10.5,next是8.5, 返回值是10.5。
第二次执行回调函数 prev是10.5,next是22, 返回值是22。
第三次执行回调函数 prev是22,next是14.8, 返回值是22。
假设有initialValue = 7;且有index,array参数,则过程如下:
第一次执行回调函数 prev是7,next是10.5,返回值是10.5;
第一次执行回调函数 prev是10.5,next是8.5, 返回值是10.5;
第二次执行回调函数 prev是10.5,next是22, 返回值是22;
第三次执行回调函数 prev是22,next是14.8, 返回值是22。
参考文章:
1. Javascript获取数组中的最大值和最小值的方法汇总
2. js判断数组最大值的原理是什么求解?
3. JavaScript专题之如何求数组的最大值和最小值
4. 详解JavaScript中数组的reduce方法
EOF
- JavaScript中最大值最小值问题
- Javascript获取数组中最大值和最小值
- JavaScript 查找数组中最大值与最小值
- 最大值最小值问题
- 查找最大值最小值问题
- 最大值最小值问题
- 最大值与最小值问题
- javascript中Max与Min,求最大值与最小值
- Javascript中获取数组最大值和最小值的方法
- 比较数组中最大值最小值
- JavaScript获取数组最大值和最小值
- JavaScript获取数组最大值和最小值
- JavaScript求数组中的最大值和最小值
- JavaScript学习之求最大值与最小值
- JavaScript获取数组中的最大值和最小值
- JavaScript求解数组中除最大值、最小值外其他数字之和
- Javascript中获取数组最大值和最小值以及最大值和最小值的下标 没学对象前的最简单最基本的方法
- 数据库中取行最大值、最小值、平均值问题
- Linux下的进度条程序
- HDMI信号解析
- python----模块(库)初识(一)
- Android View的layout_width属性是如何解析的
- POJ
- JavaScript中最大值最小值问题
- 上下界网络流
- 世界是不公平的,唯有感受是私有
- KMP模式匹配算法
- C#使用Xamarin开发可移植移动应用(5.进阶篇显示弹出窗口与通讯中心)附源码
- Java/C++实现快速排序
- ubuntu16.0源码编译opencv3.3.0
- 63 Unique Paths II
- spingDataJpa