本文介绍在 JavaScript 中获取数组最大最小值的几种常见方法。包括通过 for 循环遍历、利用 Array.prototype 扩展原型方法,以及使用 Math.max/min 配合 apply 函数的技巧。文章提供了完整的代码示例,并讨论了原型污染的风险及静态方法的实现方式,帮助开发者根据场景选择最优解。
JavaScript 获取数组最大最小值的多种实现方案
在实际开发中,获取数组的最大值和最小值的需求日益频繁。为此,我整理了几种实现方法供参考。如果代码中存在任何问题,欢迎交流探讨,共同提升技术水平。
基础遍历与原型扩展实现
首先来看第一种实现方式的示例:
var numReg = /^-?[0-9]+.?[0-9]*$/
Array.prototype.min = function() {
return this.reduce(function(preValue, curValue,index,array) {
if ( numReg.test(preValue) && numReg.test(curValue) ) {
return preValue > curValue ? curValue : preValue;
} else if ( numReg.test(preValue) ) {
return preValue;
} else if ( numReg.test(curValue) ) {
return curValue;
} else {
return 0;
}
})
}
Array.prototype.max = function() {
return this.reduce(function(preValue, curValue,index,array) {
if ( numReg.test(preValue) && numReg.test(curValue) ) {
return preValue < curValue ? curValue : preValue;
} else if ( numReg.test(preValue) ) {
return preValue;
} else if ( numReg.test(curValue) ) {
return curValue;
} else {
return 0;
}
})
}
接着是第二种示例:
function getMaximin (arr,maximin) {
if (maximin == "max") {
return Math.max.apply(Math, arr);
}else if (maximin == "min") {
return Math.min.apply(Math, arr);
}
}
var a = [3,2,4,2,10]
var b = [12,4,45,786,9,78]
alert("aMax:" + getMaximin(a,"max") + "---aMin:" + getMaximin(a,"min") + "---bMax:" + getMaximin(b,"max") + "---bMin:" + getMaximin(b,"min"))//aMax:10---aMin:2---bMax:786---bMin:4
function getMaximin (arr,maximin) {
if (maximin == "max") {
return Math.max.apply(Math, arr);
}else if (maximin == "min") {
return Math.min.apply(Math, arr);
}
}
var a = [3,2,4,2,10]
var b = [12,4,45,786,9,78]
alert("aMax:" + getMaximin(a,"max") + "---aMin:" + getMaximin(a,"min") + "---bMax:" + getMaximin(b,"max") + "---bMin:" + getMaximin(b,"min"))//aMax:10---aMin:2---bMax:786---bMin:4
利用 Math 对象与 apply 方法
此外,还有另外两种常用的实现思路:
第一种思路的具体实现如下:
//最小值
Array.prototype.min = function() {
var min = this[0];
var len = this.length;
for (var i = 1; i < len; i++){
if (this[i] < min){
min = this[i];
}
}
return min;
}
//最大值
Array.prototype.max = function() {
var max = this[0];
var len = this.length;
for (var i = 1; i < len; i++){
if (this[i] > max) {
max = this[i];
}
}
return max;
}
如果在开发中引入了第三方类库,担心其已实现了同名的原型方法从而导致冲突,可以在定义函数前增加重名判断逻辑:
if (typeof Array.prototype['max'] == 'undefined') {
Array.prototype.max = function() {
... ...
}
}
第二种思路的实现方式如下:
利用 Math.max 和 Math.min 方法可以快速得出结果。其中,apply 方法允许指定函数的调用对象及参数数组。由于 Math.max 本身接受多个参数,我们可以利用这一特性进行调用:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
需要注意的是,John Resig 将此类功能实现为 Math 对象的静态方法,因此无法使用链式调用。不过,该方法还可以进一步精简。既然 Math 对象本质上也是一个对象,我们可以采用对象字面量的方式来编写,从而节省代码体积。
Array.prototype.max = function(){
return Math.max.apply({},this)
}
Array.prototype.min = function(){
return Math.min.apply({},this)
}
[1,2,3].max()// => 3
[1,2,3].min()// => 1