如何循环遍历非常大的对象元素而不导致浏览器挂起?
我可以使用 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/