开发者问题收集

在 javascript 中将 max 应用于大型数组时如何避免堆栈溢出?

2015-06-12
1161

以下代码

var interval = function (a, b) {
          var i, list = [];
          for (i = a; i <= b; i++) {
            list.push(i);
          }
          return list;
        },
    xs = interval(1, 500000);

Math.max.apply(null, xs);

生成 Uncaught RangeError:超出最大调用堆栈大小。 如何克服?

请注意,间隔函数只是生成测试数据的快速方法。

我使用了 Math.max.apply 方法,因为它在此处描述: Mozilla 开发者网络

这不是一个可接受的解决方案,因为 javascript 允许函数调用的最大参数数量,感谢 Rocket Hazmat 指出这一点,请参阅他的回答了解更多信息。

underscore.js 库对 max 函数使用了一个简单的实现,我相信最合适的解决方案是在代码库中包含一个简单的 max 实现并使用它。有关更多详细信息,请参阅 @AnotherDev 的回答

2个回答

此处的问题出在这行:

Math.max.apply(null, xs);

您正在尝试调用 Math.max(1, 2, 3, 4, ..., 500000); 。JavaScript 不喜欢调用具有 500,000 个参数的函数。

有关更多信息,请参阅此答案: https://stackoverflow.com/a/22747272

gen_Eric
2015-06-12

如果您想要解决方法,可以使用 underscore.js

源代码 来看,它们似乎只是使用 for 循环遍历元素

for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value > result) {
          result = value;
        }
      }

这是 JSFiddle 中的一个示例

var interval = function (a, b) {
          var i, list = [];
          for (i = a; i <= b; i++) {
            list.push(i);
          }
          return list;
        },
    xs = interval(1, 500000);

console.log(_.max(xs))
//prints 500000
tcigrand
2015-06-12