簡體   English   中英

Math.min 和 Math.max 超出了最大調用堆棧大小

[英]Maximum call stack size exceeded with Math.min and Math.max

我有 js function 在 2d 數組中查找最小值和最大值,這在小 arrays 上工作正常但是當我傳遞它大數組時它給我range error

超出最大調用堆棧大小。

我正在使用最新版本的 Chrome。

function MaxMin2dray(arr, idx){
    return {
       min: Math.min.apply(null, arr.map(function (e) { return e[idx]})),
        max: Math.max.apply(null, arr.map(function (e) { return e[idx]}))
  }
}

Math.min & Math.max

Math.minMath.max最有可能崩潰,或者為大數組返回NaN (~10⁷)

(見@DavidWaters 和@EugeneGluhotorenko 評論)。

相反,您可以像這樣使用舊的 javascript 循環:

(第二個功能要快得多)

function getMax(arr) {
    return arr.reduce((max, v) => max >= v ? max : v, -Infinity);
}

或者

function getMax(arr) {
    let len = arr.length;
    let max = -Infinity;

    while (len--) {
        max = arr[len] > max ? arr[len] : max;
    }
    return max;
}
  • 測試了 1,000,000 個項目:
    第一個函數運行時間(在我的機器上)是 15.84 毫秒。 第二個功能只有 4.32ms。
function minMax2DArray(arr, idx) {
    var max = -Number.MAX_VALUE,
        min = Number.MAX_VALUE;
    arr.forEach(function(e) {
        if (max < e[idx]) {
            max = e[idx];
        }
        if (min > e[idx]) {
           min = e[idx];
       }
    });
    return {max: max, min: min};
}

👆 編輯:刪除了MIN_VALUE使用(見下面的帖子)。

現代化版本

const arrayMinMax = (arr) =>
  arr.reduce(([min, max], val) => [Math.min(min, val), Math.max(max, val)], [
    Number.POSITIVE_INFINITY,
    Number.NEGATIVE_INFINITY,
  ]);

bjornl 的回答有問題。 根據https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE

MIN_VALUE 屬性是最接近 0 的數字,而不是 JavaScript 可以表示的最負數。

更新后的代碼:

function minMax2DArray(arr, idx) {
    var max = -Number.MAX_VALUE,
        min = Number.MAX_VALUE;
    arr.forEach(function(e) {
        if (max < e[idx]) {
            max = e[idx];
        }
        if (min > e[idx]) {
           min = e[idx];
       }
    });
    return {max: max, min: min};
}

使用 lodash 庫中的minmax函數, https://lodash.com/docs/4.17.15#max

您可以將 arrays 直接傳遞給它們,而不是Math.maxMath.min函數,它們可以很好地處理巨大的 arrays 數字。 我有一個類似的問題,並通過 lodash 的函數解決了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM