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

时间:2015-06-12 18:12:06

标签: javascript

以下代码

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 developer network

这不是一个可接受的解决方案,因为javascript具有允许函数调用的最大参数数量,这要归功于Rocket Hazmat指出它,请参阅他的答案以获取更多信息。

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

2 个答案:

答案 0 :(得分:4)

问题在于:

Math.max(1, 2, 3, 4, ..., 500000);

您正试图致电didUpdateLocations。 JavaScript并不像调用具有500,000个参数的函数。

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

答案 1 :(得分:3)

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

source code开始,看起来他们只是使用for循环遍历元素

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

Here is an example in 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