JavaScript 获取数组最大最小值的多种实现方案

作者:异步漫步时间:2026-10-31 01:04:54浏览:205

本文介绍在 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

作者最新文章