2017-02-14 3 views
0

Как пропустить очень большие элементы объекта, не заставляя браузер зависать?Петля через большой объект Javascript с setTimeout

я могу легко цикл через массив с 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:...},...], но это такая пустая трата пространства.

+0

Определить «очень большие элементы объекта» –

+1

Object.keys() дает вам массив имен свойств, которые вы можете перебрать. – Shilly

+1

[Веб-рабочие] (https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers) или на стороне сервера являются хорошими альтернативами для многопоточной работы. Но только в современных браузерах для веб-работников. – Mouser

ответ

1

Вы можете использовать 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); 

Но для миллионов и миллионов ключей, вы должны искать различные решения, так как вы не хотите, чтобы перебрать, что многие. Может быть, разбить все на партии и тому подобное.

Следовательно, мой вопрос возникает, когда вы действительно нуждаетесь в миллионах объектов в памяти одновременно, поскольку это звучит как проблема дизайна.

+0

игнорировать «milions», я только шутил, ваш ответ прекрасен. для объекта с 100 000 элементами возвращаемое значение 'Object.keys' менее чем за 30 мс. На самом деле у меня гораздо меньше объекта для обработки, но я скорее беру крайние случаи в качестве тестовых случаев. – Peter

Смежные вопросы