Функция jquery .filter () на большом массиве работает медленно в IE - PullRequest
0 голосов
/ 13 января 2012

У меня есть массив объектов javascript, содержащий около 6300 элементов.

Я пытаюсь использовать 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 выдает ошибку из-за слишком медленного выполнения скрипта. Есть ли более быстрый способ сделать это?

* EDIT *** Исходя из приведенных ниже отзывов, я изменил метод, используемый для циклов вместо .each () и .filter (), но я все еще получаю сообщение «Остановить этот скрипт?» диалог в IE.

Вот пересмотренный код, использующий циклы for. Кроме того, я включил все фильтры, которые пытаюсь заполнить (не только первый).

    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);
        }
    }

1 Ответ

1 голос
/ 13 января 2012

Отбрасывание jQuery each(), безусловно, вариант, так как он делает некоторые забавные вещи с областью действия помимо реальной итерации.Другое реальное, что ваш алгоритм выглядит как O (n ^ 2), что довольно плохо.Я бы просто отсортировал ваше значение dataSet по Jurisdiction, а затем перебрал бы, сохраняя предыдущее значение и удаляя дубликаты.Это будет O алгоритма сортировки, который, вероятно, использует алгоритм быстрой сортировки O (n * log (n)), но, вероятно, также реализован гораздо более эффективно в собственном коде.

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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...