我有一个包含大约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);
}
}
答案 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];
}