如何轻松获得 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.min
和Math.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;
};