약 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);
}
}
속도가 목표 인 경우, 당신이해야 할 첫 번째 일은 오히려 .filter'이하 함수 호출로 루프에 대한 전환이다()'와'.each()'. – jfriend00
두 개의 배열을 병합하는 것이 목표입니까? 이 경우에 배열이 큽니다. 배열에 항목을 저장하는 데 객체를 사용하면 훨씬 빠르게 찾을 수 있습니다. 왜냐하면'obj에있는 a '는 큰 배열에 대해'arr.indexOf (a)'보다 훨씬 빠를 것이기 때문입니다 배열. (여기서'a'는 찾으려는 것입니다,'obj'는 값을 키로 가지는 객체이고'arr'은 객체의 배열입니다.) –
가지고있는 데이터 값과 당신이 가지고있는 데이터 값을 기술 할 수 있다면 사람들을 성취하려고 시도하는 것이 아마도 더 나은 코드를 제안 할 수 있으며 아마도 객체를 조회 테이블로 사용하게 될 것입니다. 그러나 짧은 코드를 통해 얻으려는 데이터와 수행하고자하는 데이터를 따라갈 수는 없습니다. 루프에서 .indexOf를 반복적으로 호출하는 모든 것은 객체를 만들기위한 전처리 과정을 의미한다고해도 객체의 조회로 대체되어야합니다. – jfriend00