作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何循环遍历非常大的对象元素而不导致浏览器挂起?
我可以使用 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/
我是一名优秀的程序员,十分优秀!