协慌网

登录 贡献 社区

在 JavaScript 中查找数组的 min / max 元素

如何轻松获得 JavaScript 数组的 min 或 max 元素?

伪代码示例:

let array = [100, 0, 50]

array.min() //=> 0
array.max() //=> 100

答案

如何扩充内置 Array 对象以使用Math.max / Math.min代替:

Array.prototype.max = function() {
  return Math.max.apply(null, this);
};

Array.prototype.min = function() {
  return Math.min.apply(null, this);
};

这是一个JSFiddle

增强内置函数可能会导致与其他库发生冲突(有些人看到了),因此,您可以对直接apply 'ing Math.xxx()直接应用于您的数组感到更舒服:

var min = Math.min.apply(null, arr),
    max = Math.max.apply(null, arr);

或者,假设您的浏览器支持 ECMAScript 6,则可以使用散布运算符 ,其功能类似于apply方法:

var min = Math.min( ...arr ),
    max = Math.max( ...arr );
var max_of_array = Math.max.apply(Math, array);

有关完整的讨论,请参见: http : //aaroncrane.co.uk/2008/11/javascript_max_api/

对于大数组(〜10 个元素), Math.minMath.max都在 Node.js 中产生以下错误。

RangeError:超出最大调用堆栈大小

一个更健壮的解决方案是不将每个元素都添加到调用堆栈中,而是传递一个数组:

function arrayMin(arr) {
  return arr.reduce(function (p, v) {
    return ( p < v ? p : v );
  });
}

function arrayMax(arr) {
  return arr.reduce(function (p, v) {
    return ( p > v ? p : v );
  });
}

如果您担心速度,那么下面的代码Math.max.apply快 3 倍。参见http://jsperf.com/min-and-max-in-array/2

function arrayMin(arr) {
  var len = arr.length, min = Infinity;
  while (len--) {
    if (arr[len] < min) {
      min = arr[len];
    }
  }
  return min;
};

function arrayMax(arr) {
  var len = arr.length, max = -Infinity;
  while (len--) {
    if (arr[len] > max) {
      max = arr[len];
    }
  }
  return max;
};

如果您的数组包含字符串而不是数字,则还需要将它们强制转换为数字。下面的代码可以做到这一点,但是它会使我的机器上的代码速度降低约 10 倍。参见http://jsperf.com/min-and-max-in-array/3

function arrayMin(arr) {
  var len = arr.length, min = Infinity;
  while (len--) {
    if (Number(arr[len]) < min) {
      min = Number(arr[len]);
    }
  }
  return min;
};

function arrayMax(arr) {
  var len = arr.length, max = -Infinity;
  while (len--) {
    if (Number(arr[len]) > max) {
      max = Number(arr[len]);
    }
  }
  return max;
};