2012-01-13 3 views
0

약 6300 개의 요소가 포함 된 javascript 객체 배열이 있습니다.큰 배열의 jquery .filter() 함수가 IE에서 느립니다.

jQuery를 사용하여 이러한 요소를 반복하고 해당 드롭 다운 목록의 옵션 목록을 만들어 6300 개 요소를 필터링 할 수 있습니다.

Firefox에서는 문제없이 작동하지만 IE에서는 느리게 실행되는 스크립트에 대한 오류가 표시됩니다. 나는 그 IE 오류를 일으키지 않고 데이터 집합을 얻으려는 코드를 가지고 놀았지만, 지금까지는 운이 없었습니다. 다음은 이미 시도한 방법입니다.

"관할 구역"의 고유 목록을 만들려면 "indexOf"를 사용하십시오. 값이 이미 차 배열이 존재하고 있지 않으면, 다음에 추가되는지 검사 각 소자 위에

var arrayJurisdiction = dataSet.filter(function (item, i, a) { 
     return i.Jurisdiction == a.indexOf(item.Jurisdiction); 
    }); 

를 순회.

g$.each(dataSet, function (key, value) { 
     var matchingJurisdiction = arrayJurisdiction.filter(function (item) { 
      return value.Jurisdiction == item; 
     })[0]; 
     if (matchingJurisdiction == null) { 
      arrayJurisdiction.push(value.Jurisdiction); 
     } 
    }); 

이 두 가지 방법 모두 IE가 너무 느리게 실행되는 스크립트에 대한 오류를 표시합니다. 이 작업을 수행하는 더 빠른 방법이 있습니까?

*이 편집 *** 아래의 의견을 바탕으로 , 내가 대신 .each의 루프()와 .filter()에 사용할 방법을 변경,하지만 난 여전히 "이 스크립트를 중지 수신하고 ? " IE의 대화 상자.

여기에 for 루프를 사용하여 수정 된 코드가 있습니다. 또한 필자는 필자가 채우려 고 시도하고있는 모든 필터들을 포함시켰다. 그것은 실제 반복 옆의 범위와 약간의 재미 물건처럼 jQuery를 each() 삭제

for (var i = 0; i < dataSet.length; i++) { 
     var value = dataSet[i]; 

     var matchingJurisdiction = null; 
     for (var i = 0; i < arrayJurisdiction.length; i++) { 
      var item = arrayJurisdiction[i]; 
      if (item == value.Jurisdiction) { 
       matchingJurisdiction == item; 
       break; 
      } 
     } 
     if (matchingJurisdiction == null) { 
      arrayJurisdiction.push(value.Jurisdiction); 
     } 



     var valueYear = new Date(value.Treatment_Date).getFullYear(); 
     var matchingYear = null; 
     for (var i = 0; i < arrayYear.length; i++) { 
      var item = arrayYear[i]; 
      if (item == valueYear) { 
       matchingYear == item; 
       break; 
      } 
     } 

     if (matchingYear == null) { 
      arrayYear.push(valueYear); 
     } 
     var matchingProjectClass = null; 
     for (var i = 0; i < arrayProjectClass.length; i++) { 
      var item = arrayProjectClass[i]; 
      if (item == valueYear) { 
       matchingProjectClass == item; 
       break; 
      } 
     } 
     if (matchingProjectClass == null) { 
      arrayProjectClass.push(value.Project_Classification); 
     } 

     var matchingImprovementType = null; 
     for (var i = 0; i < arrayImprovementType.length; i++) { 
      var item = arrayImprovementType[i]; 
      if (item == valueYear) { 
       matchingImprovementType == item; 
       break; 
      } 
     } 
     if (matchingImprovementType == null) { 
      arrayImprovementType.push(value.Improvement_Type); 
     } 
    } 
+2

속도가 목표 인 경우, 당신이해야 할 첫 번째 일은 오히려 .filter'이하 함수 호출로 루프에 대한 전환이다()'와'.each()'. – jfriend00

+0

두 개의 배열을 병합하는 것이 목표입니까? 이 경우에 배열이 큽니다. 배열에 항목을 저장하는 데 객체를 사용하면 훨씬 빠르게 찾을 수 있습니다. 왜냐하면'obj에있는 a '는 큰 배열에 대해'arr.indexOf (a)'보다 훨씬 빠를 것이기 때문입니다 배열. (여기서'a'는 찾으려는 것입니다,'obj'는 값을 키로 가지는 객체이고'arr'은 객체의 배열입니다.) –

+0

가지고있는 데이터 값과 당신이 가지고있는 데이터 값을 기술 할 수 있다면 사람들을 성취하려고 시도하는 것이 아마도 더 나은 코드를 제안 할 수 있으며 아마도 객체를 조회 테이블로 사용하게 될 것입니다. 그러나 짧은 코드를 통해 얻으려는 데이터와 수행하고자하는 데이터를 따라갈 수는 없습니다. 루프에서 .indexOf를 반복적으로 호출하는 모든 것은 객체를 만들기위한 전처리 과정을 의미한다고해도 객체의 조회로 대체되어야합니다. – jfriend00

답변

1

확실히 옵션입니다. 또 다른 진짜는 알고리즘이 O (n^2) 인 것 같고 꽤 나쁘다는 것입니다. 간단히 을 Jurisdiction 값으로 정렬 한 다음 이전 값을 유지하고 중복을 제거하여 반복합니다. 그것은 빠른 정렬 알고리즘 O (n * log (n))을 사용하는 가능성이있는 정렬 알고리즘 O가 될 것이지만 원시 코드에서 훨씬 더 효율적으로 구현 될 가능성이 높습니다.

dataSet.sort(function(a, b) 
{ 
    if (a.Jurisdiction > b.Jurisdiction) 
     return 1; 
    if (a.Jurisdiction < b.Jurisdiction) 
     return -1; 
    return 0; 
}); 

var prev = null; 
var filtered = new Array(dataSet.length); 
for (var i=0; i<dataSet.length; i++) 
{ 
    if (prev == null || prev.Jurisdiction != dataSet[i].Jusrisdiction) 
     filtered.push(dataSet[i]); 
    prev = dataSet[i]; 
} 
+0

+1. – Gabe

관련 문제