IE中大型数组的jquery .filter()函数很慢

时间:2012-01-13 14:18:05

标签: jquery performance internet-explorer

我有一个包含大约6300个元素的javascript对象数组。

我正在尝试使用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给我一个关于脚本运行太慢的错误。有没有更快的方法呢?

*编辑*** 根据下面的反馈,我已经改变了使用for循环而不是.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 个答案:

答案 0 :(得分:1)

删除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];
}