我需要计算一个大数组的最小值和最大值。我知道可以使用Math.max.apply()
函数,但在处理大数组时会出现栈溢出异常。有没有简单的解决方案?
我需要计算一个大数组的最小值和最大值。我知道可以使用Math.max.apply()
函数,但在处理大数组时会出现栈溢出异常。有没有简单的解决方案?
Sort the array by using sort()
method it sorts array by using quicksort algorithm
Since array is sorted in ascending order then the last element is the max
var arr = [1,4,6,4, ...];
arr.sort((a, b) => a - b);
var max = arr[arr.length - 1];
arr.sort((a, b) => b - a)[0]
。 - micahbfArray.prototype.min = function() {
var r = this[0];
this.forEach(function(v,i,a){if (v<r) r=v;});
return r;
};
来自JavaScript:min&max数组值?,该问题的其他解决方案在此讨论。
提醒一下:我只是谷歌了“max min large array”,并将其作为第一个结果找到...
为什么不直接遍历整个数组?
var max = Number.MIN_VALUE, min = Number.MAX_VALUE;
for (var i = 0, len=list.length; i < len; i++) {
if (list[i] > max) max = list[i];
if (list[i] < min) min = list[i];
}
编辑:
针对最大值:
if (typeof Array.prototype.GetMax === "undefined") {
Array.prototype.GetMax = function() {
var max = Number.MAX_VALUE;
for (var i = 0, len=this.length; i < len; i++) {
if (this[i] > max) max = this[i];
}
return max;
}
}
对于 min:
if (typeof Array.prototype.GetMin === "undefined") {
Array.prototype.GetMin = function() {
var min = Number.MIN_VALUE;
for (var i = 0, len=this.length; i < len; i++) {
if (this[i] < min) min = this[i];
}
return min;
}
}
对于两者:
if (typeof Array.prototype.GetMaxMin === "undefined") {
Array.prototype.GetMaxMin = function() {
var max = Number.MIN_VALUE, min = Number.MAX_VALUE;
for (var i = 0, len=this.length; i < len; i++) {
if (this[i] > max) max = this[i];
if (this[i] < min) min = this[i];
}
return { Max: max, Min: min};
}
}
Number.MAX_VALUE
/Number.MIN_VALUE
初始化 min
/max
,然后您就可以删除第一个 if 条件。 - Sirko我可以假设你已经考虑过这个问题:
var maxSoFar = -9999999;
for (var i = 0; i < array.length ; ++i) {
if (array[i] > maxSoFar) {
maxSoFar = array[i];
}
... similar for minSoFar ...
}
试试这个
var arr = [];
for(var i=1000000;i>0;i--)
{
arr.push(i);
}
//we create a copy of the original array through arr.concat() since we do not want to change the original sorting order of the array
//we pass a function in the sort method as by default it sorts alphabetically instead of numerically. So 99 will be smaller than 100.
var arrMaxMin = arr.concat().sort(function(a,b){return a-b});
arrMaxMin[0]; //min
arrMaxMin[arrMaxMin.length - 1]; //max
嘿,为什么不将数组切成较小的数组,然后在这些数组上轻松使用Math.max.apply(Math,individual arrays)。但是请记住,一旦获得所需的最大值,必须重新将所有子数组初始化为null,以便释放内存。
这正是reduce
所用之处:
function max(arr) {
if (arr.length === 0) {
return NaN // or whatever answer you want for an empty array, or throw an error.
}
return arr.reduce((a, b) => Math.max(a, b), -Infinity)
}
console.log(max([...new Array(100000).keys()]))
[...new Array(100000).keys()]
只是现代浏览器中一种制作包含数字0到999999的巨大数组的花哨方式。而max
函数本身在过去20年内的任何编程环境中都可以运行。arr.reduce((cur, val, i) => i === 0 ? val : Math.max(cur, val), NaN)
这里NaN
是当数组为空时返回的值。
甚至更多。
arr.reduce((a, b) => Math.max(a, b), -Infinity)
虽然这将对空数组返回-Infinity
。
最后,仅仅这样做可能很诱人:
arr.reduce(Math.max, -Infinity) //don't do this!!
但这样做是行不通的。这是因为reduce
调用它的函数(Math.max
)带有4个参数,其中一个是原始数组,所以对它们进行Math.max
将始终导致NaN
。