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

顾言
顾言
发布时间:2026-10-14 | 4人浏览过
原创

在 JavaScript 开发中,获取数组的最大值和最小值是常见的数据整理需求。本文总结了从原生 API 到自定义原型的五种主流实现方式,涵盖性能考量与边界情况处理,帮助开发者编写更健壮的基础工具函数。

结果与目标

我们需要在 JavaScript 数组中找到数值型的最大值和最小值。由于 Array 对象本身不提供直接的 max() 或 min() 方法,必须借助数学对象、循环逻辑或数组高阶方法进行转换。

准备条件

  • 运行环境:任何支持 ECMAScript 标准的浏览器或 Node.js 环境。
  • 数据前提:输入应为包含数字的数组。若包含非数字项或混合类型,需考虑类型转换或过滤逻辑。
  • 依赖说明:以下方法均为原生 JS 实现,无需引入 jQuery 等第三方库。

真实操作顺序

第1步:使用 Math.apply 展开数组参数

目的:利用 Math.max 和 Math.min 接受不定数量参数的特性,配合 apply 方法将数组展开为独立参数。

动作:
这是最简洁且性能较好的方式,但需注意数组长度限制(部分旧版浏览器对参数数量有上限)。

// 定义静态辅助方法
Array.max = function(array) {
  return Math.max.apply(Math, array);
};

Array.min = function(array) {
  return Math.min.apply(Math, array);
};

// 使用字面量简化原型链调用
Array.prototype.max = function() { 
  return Math.max.apply({}, this); 
};
Array.prototype.min = function() { 
  return Math.min.apply({}, this); 
};

// 测试
console.log([1, 2, 3].max()); // 输出: 3
console.log([1, 2, 3].min()); // 输出: 1

第2步:通过 for 循环手动比较

目的:提供最基础的算法逻辑,不依赖高级 API,兼容极老环境,且逻辑直观。

动作:
初始化变量记录当前极值,遍历数组逐项比较并更新。

// 最小值
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;
};

第3步:封装通用函数返回最大/最小

目的:避免污染原型对象,以单一函数根据参数动态返回结果,安全性更高。

动作:
判断传入的标识符是 "max" 还是 "min",分别调用对应的 Math 方法。

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];

console.log(
  "aMax:" + getMaximin(a, "max") + "---aMin:" + getMaximin(a, "min") +
  "---bMax:" + getMaximin(b, "max") + "---bMin:" + getMaximin(b, "min")
);
// 输出: aMax:10---aMin:2---bMax:786---bMin:4

第4步:使用 reduce 进行累归计算

目的:处理可能包含非数字字符串的混合数组,具备一定的容错清洗能力。

动作:
通过正则表达式验证数值有效性,仅在两者均为有效数字时进行比较。

var numReg = /^-?[0-9]+\.?[0-9]*$/;

Array.prototype.min = function() {
  return this.reduce(function(preValue, curValue) {
    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;
    }
  })
};

第5步:防止原型冲突的安全注入

目的:如果在项目中引入了其他类库,直接扩展 Array.prototype 可能导致命名冲突或覆盖原有功能。应先检查是否存在该方法。

动作:
在使用 if (typeof Array.prototype['max'] == 'undefined') 包裹扩展代码。

if (typeof Array.prototype['max'] == 'undefined') { 
  Array.prototype.max = function() { 
    // ... 具体的 max 实现逻辑 ...
  };
}

完成判断

执行上述代码后,控制台应输出预期的最大或最小数值。对于常规开发,推荐使用 第1步(Math.apply) 或 第3步(封装函数),因为它们不涉及原型污染,且在现代引擎中性能优异。

简要总结

以上就是 JavaScript 数组中获取最大最小值的详细内容。核心思路是将数组元素转化为数学函数的多参数形式,或利用循环/归并逐个比较。在实际工程中,建议优先使用标准库函数而非随意扩展原型,以保证代码的可维护性和兼容性。更多关于 JavaScript 数组操作的技术资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表