2012-06-22 4 views
1

현재 2 개의 for-loops를 실행 중이며 2 개의 객체 배열을 통과하고 두 개의 목록에있는 객체로 새 배열을 생성하고 있습니다. 목록이 커지면 "스크립트 실행 중지"프롬프트가 나타납니다.대용량의 데이터를로드 할 때 "스크립트 실행 중지"를 방지하십시오.

MineGlobals.receivedData = jQuery.parseJSON(MineGlobals.receivedDataRaw); 
MineGlobals.nettStasjonsListe = new Array(); 

var len1 = MineGlobals.nsData.length; 
var len2 = MineGlobals.receivedData.Nettstasjoner.length 
for (var i = 0; i < len2; i++) { 
     for (var j = 0; j < len1; j++) { 
      if (MineGlobals.receivedData.Nettstasjoner[i].Id == MineGlobals.nsData[j].Id) { 
       var obj = new nsObject(); 
       obj = MineGlobals.nsData[j]; 
       if (MineGlobals.nsData[j].Lg != 0 && MineGlobals.nsData[j].La != 0) { 
        MineGlobals.nettStasjonsListe.push(obj);  
       } 
       break; 
      } 
     } 
    } 

setTimeout()으로 시도했지만 작동하지 못했습니다 ... 어떤 아이디어가 있습니까? 나는 새로운 사용자 오전부터

편집

그래서 난 내 자신의 질문에 대답 할 수는 없지만 나는 해결책을 찾을 수 있었다. associativeArray()를 사용했습니다. ID가 키 인 가장 큰 배열을 배치 한 다음 반복하여 동일한 ID를 찾습니다.

var associativeArray = {}; 
for (var i = 0; i < len1; i++) { 
    associativeArray[MineGlobals.nsData[i].Id] = MineGlobals.nsData[i]; 
} 

for (var j = 0; j < len2; j++) { 
    var obj = new nsObject(); 
    obj = associativeArray[MineGlobals.receivedData.Nettstasjoner[j].Id]; 
    if (obj != undefined) { 
     if (obj.Lg != 0 && obj.La != 0) { 
      if (obj == null || obj == "") { 
       obj.Nvn = "Ikke definert"; 
      } 
      if (obj.NisAdresse == null || obj.NisAdresse == "") { 
       obj.NisAdresse = "Ikke definert"; 
      } 
      MineGlobals.nettStasjonsListe.push(obj); 
     } 
    } 
} 
+0

당신은 배열을 구축하고를 두 개의 큰 배열의 산물로서? 결과 배열/행렬의 예상 크기는 바이트 단위로 무엇입니까? 문제가 메모리와 관련이 없다고 확신합니까? –

+0

* setTimeout()으로 시도한 * ... 어떻게? 비동기 처리 대기열을 사용하는 것은이를 해결하는 한 가지 방법입니다. 아니면 웹 근로자 ... –

+0

이것은별로 도움이되지 않을 수도 있지만 시도해 볼 수 있습니다. 루프의 경우 증분 루프를 수행하는 대신 반대 작업을 수행 할 수 있습니다. for (var j = len1; j> 0; j -)'인터프리터는 한 값을 다른 변수와 비교하는 것보다 훨씬 빠르다. 특히이 경우 두 개의 큰 for 루프가 있습니다. – tmaster

답변

0

당신은 참조 배열 처리를 chunklink 다음

나는 주위에 프로토 타입 클래스를 작성하고이에 대한 내 문제 해결 :

/** 
* provides UI update while using large arrays without blocking 
* found core idea on http://www.mattsnider.com/javascript/handle-slow-processes-without-blocking-the-ui/ 
*/ 
var ChunkedArray = Class.create(Enumerable, { 
    initialize: function(options) { 
     this.array = new Array(); 
     this.options = Object.extend({ 
      chunkSize: 20, 
      interval: 10 
     }, options || {}) 
    }, 

    push: function(obj) { 
     this.array.push(obj) 
    }, 

    chunk: function(array, index, length, iterator, context) { 
     var j, l = array.length; 
     for (j = (index + length); (index < j && index < l); index += 1) { 
      iterator.call(context, array[index], index); 
     } 

     if (l > index) { 
      setTimeout(function() { 
       this.chunk(array, index, length, iterator, context); 
      }.bind(this), this.options.interval); 
     } 
    }, 

    _each: function(iterator, context) { 
     this.chunk(this.array, 0, 
       this.options.chunkSize, iterator, context); 
    }, 

    toString: function() { 
     return this.array.toString(); 
    } 
}); 
관련 문제