最近碰到了一个比较最大值的问题,想了一些时间,虽说自己弄出来了,但是方法还是不太好用。觉得应该还有其它方法。因此在网上也看了一些文章,现在做一些整理总结。
以下是自己写的:
有如下数字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'); //22
getMaxMin(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'); //22
getMaxMin(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 | next | index | array | returnValue | |
---|---|---|---|---|---|
first call | 7 | 10.5 | 0 | [10.5, 8.5, 22, 14.8] | 10.5 |
second call | 10.5 | 8.5 | 1 | [10.5, 8.5, 22, 14.8] | 10.5 |
third call | 10.5 | 22 | 2 | [10.5, 8.5, 22, 14.8] | 22 |
fourth call | 22 | 14.8 | 3 | [10.5, 8.5, 22, 14.8] | 22 |
第一次执行回调函数 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