Ну тут напрашивается обычный цикл
for (key in array){...}
UPDATE:
Если вам действительно нужно обрабатывать огромные разреженные массивы на javascript и подвешивать процесс не желательно (что на самом то деле надо избегать вообще), то можно попробовать делать это асинхронно как писали
Константин Отпущенников и
evg_ (однако они не предложили как можно итерировать объект асинхронно, а нам нужна итерация именно объекта, а не массива в данном случае). Так вот я нашел одно решение, оно довольно.. кхм.. специфическое, если придумаете способ лучше - пишите. Проблема в том, что мы можем перебрать часть свойств мегообъекта и break'нуться из цикла, но мы не сможем вернуться в то же место, поэтому надо как-то добиться запоминания состояния цикла... и единственное, что я нашел - это удалять элементы первоначального объекта (их можно и восстановить в другой, но вы это можете добавить сами если будет нужно).
Особенности метода:
- изменение изначального объекта;
- скорость просядет на порядки (без преувеличений, у меня этот способ оказался в 200 - 400 раз медленее);
- зато можно не вешать всю страницу;
- выбирать порцию данных за один проход (чем больше, тем медленнее алгоритм для одной части (больше тормозов на странице), за то быстрее обработка в целом);
- можно повесить прогресс бар, отображающий прогресс итерации;
Код:
var arr = [];
for (var i = 0; i < 100 * 1000; i++){
arr.push(i);
};
function bench(name, fn){
var startTime = performance.now();
var res = fn();
var finishTime = performance.now();
console.log(name + ' took: ', finishTime - startTime);
return res;
};
bench('get keys', ()=>
Object.keys(arr) // ~670 ms
);
// --------------
function getKeyValAsync(bigObject, limit, cb){
var result = [];
function getPart(){
var doneAmount = 0;
for (var i in bigObject){
if (!bigObject.hasOwnProperty(i)){
continue;
};
result.push({
key: i,
val: bigObject[i]
});
delete bigObject[i];
doneAmount++;
if (doneAmount > limit){
setTimeout(() => bench('part: ', getPart), 10);
return;
};
};
cb(result);
};
getPart();
};
var keyValPairs;
var start = performance.now();
getKeyValAsync(arr, 10000, res => {
keyValPairs = res;
console.log('By parts time: ' + (performance.now() - start));
});