javascript - 使用 setTimeout 循环遍历大 Javascript 对象

标签 javascript arrays loops object

如何循环遍历非常大的对象元素而不导致浏览器挂起?

我可以使用 setTimeout/setInterval 轻松循环数组,如下所示:

var i = 0;
var l = arr.length;
var interval = window.setInterval(function(){
   var k = 100; // process 100 items on each Timeout
   var element;
   while(k--) {
      if (i == l) {
          return clearInterval(interval);
      }
      element = arr[i++];
      // ... work here ...
   }
}, 100);

但是对于非常大的物体我有什么选择?

  • 首先读取键 for(k in arr) 不是一个选项,因为这将是一个我想避免的大循环。
  • 我无法使用 .splice() 对象,因为它不是数组。

目前我正在创建这样的数组 [{k: .., v:...},{k: .., v:...},{k: .., v:.. .},{k: .., v:...},{k: .., v:...},{k: .., v:...},{k: .., v: ...},...] 但这太浪费空间了。

最佳答案

您可以使用 Object.keys 对对象执行完全相同的逻辑

var i = 0;
var keys = Object.keys( myObj );
var l = keys.length;
var interval = window.setInterval(function(){
   var k = 100; // process 100 items on each Timeout
   var element;
   while(k--) {
      if (i == l) {
          return clearInterval(interval);
      }
      element = myObj[ keys[i++] ];
      // ... work here ...
   }
}, 100);

但是对于数以百万计的键,您应该寻找不同的解决方案,因为您不想循环那么多。也许将所有内容分成批处理等。

因此我的问题是,是否有时您实际上需要同时在内存中存储数百万个对象,因为这听起来像是一个设计问题。

关于javascript - 使用 setTimeout 循环遍历大 Javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42227273/

相关文章:

javascript - 防止 JavaScript Number 函数舍入大数字

javascript计算人的年龄和高度

java - 将字符串转换为字符串数组

python - 我在无限循环的尝试中做错了什么?

javascript - 如何优化这个for循环函数?

Javascript setInterval 连续多行

javascript - 如何使 textarea 内容可以设置样式或设置 div 行为(如 textarea 行为)?

python - 在 NumPy 中使用两个 bool 数组进行索引

c - 如何获取多维数组中的数组数量

vba - 工作簿中所有工作表的循环不起作用