【问题标题】:array with numbers (5+million)带有数字的数组(5+百万)
【发布时间】:2016-04-25 11:32:52
【问题描述】:

我需要一个数字范围从 0 开始到大约 500 万结束的“列表”。我还必须在网络浏览器中显示它,所以我尝试了 javascript 和 php。当然,在“加载”所有数字时,浏览器会崩溃。有没有办法防止这种情况?真正让它在浏览器中工作?我猜 Javascript 不是正确的语言,但我怎么能解决这个问题?帮助将不胜感激:)

这是目前为止的代码

function range()
{
    var array = [];
    var start = (arguments[0] ? arguments[0] : 0);
    var end   = (arguments[1] ? arguments[1] : 9);
    if (start == end) { array.push(start); return array; }
    var inc   = (arguments[2] ? Math.abs(arguments[2]) : 1);
    inc *= (start > end ? -1 : 1);
    for (var i = start; (start < end ? i <= end : i >= end) ; i += inc)
        array.push(i);
    return array;
}

var foo = range(1, 5607249)

for(var i=0;i<foo.length;i++){
  document.write(foo[i]); 
}

【问题讨论】:

  • 为什么要同时显示 500 万个数字?语言不是这里的问题。存储 42MB 的双打也不是问题。
  • 浏览器崩溃怎么崩溃了?你看到了什么错误(如果有的话)?哪个浏览器?哪个版本?你试过其他浏览器吗? 500万也不算多,应该可以搞定的。
  • 这听起来像是一个 XY 问题。用例是什么?
  • 另外,document.write 在这里也可能是一个非常糟糕的选择。
  • 500 万个 document.writes,糟糕的选择。一次写入屏幕,更好的选择。

标签: javascript arrays numbers


【解决方案1】:

在不使浏览器崩溃的情况下显示这么多数据的唯一方法是实现某种分页系统。意思是,一次只显示一部分结果。为此,您可以设置一次显示的最大结果数并跟踪页码。

function range()
{
    var array = [];
    var start = (arguments[0] ? arguments[0] : 0);
    var end   = (arguments[1] ? arguments[1] : 9);
    if (start == end) { array.push(start); return array; }
    var inc   = (arguments[2] ? Math.abs(arguments[2]) : 1);
    inc *= (start > end ? -1 : 1);
    for (var i = start; (start < end ? i <= end : i >= end) ; i += inc)
        array.push(i);
    return array;
}

var foo = range(1, 5607249);
var results = document.querySelector('.results');
var page = 0;
var PAGE_LENGTH = 100;
function showResults() {
  var start = page * PAGE_LENGTH;
  var end = start + PAGE_LENGTH;
  // Write them all at once and put line breaks between them
  results.innerHTML = foo.slice(start, end).join('<br />');
}

document.querySelector('.prev').addEventListener('click', function() {
  // Make sure we don't go past the first page
  page = Math.max(0, page - 1);
  showResults();
});
document.querySelector('.next').addEventListener('click', function() {
  // Don't go past the end of the results 
  page = Math.min(page + 1, foo.length / PAGE_LENGTH - 1);
  showResults();
});

showResults();
<div class="results"></div>
<button class="prev">Prev</button>
<button class="next">Next</button>

【讨论】:

  • 是的,太棒了!非常感谢您的努力!
猜你喜欢
  • 2022-12-07
  • 2012-07-26
  • 2013-09-10
  • 1970-01-01
  • 2013-07-06
  • 2011-01-04
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
相关资源
最近更新 更多