优化IE的简单双循环

时间:2011-04-12 11:24:54

标签: javascript internet-explorer optimization

array.sort(function(left, right) {
    return index(otherArray, left) < index(otherArray, right);
});

这是O(len(array) ^ 2)因此,对于一个合理大小的len = 1000数组,这需要不间断的* 100万次操作,这很容易超过IE 500万运营商的上限。

因此IE抛出脚本的时间太长,即使速度很快。

问题是IE没有它自己的Array.prototype.indexOf所以我无法将操作计数减少到O(len(array)并依赖最终使用double for循环而不是单个for循环

我考虑过array.join并使用String.prototype.indexOf但是数组中的对象是DOM元素,你不能将它们转换为字符串(很容易)。

告诉IE用户删除此默认上限不是一种选择。

2 个答案:

答案 0 :(得分:2)

我可以想到这个问题的两个可能的解决方案:其中一个可以在任何地方工作,另一个完全是IE专有的(我希望在IE9中不起作用,但支持Array.prototype.indexOf,所以这不是问题。)

第一个更简单的解决方案是在所需订单的每个HTMLElement上设置一个属性并按此排序。如果你关心所需的命令持久化,你必须确保HTMLElement对象不会被垃圾收集,所以你必须保持对它们的引用(在全局范围内创建一个数组可能是最简单的)对于它)。

仅使用IE的解决方案是使用查找对象和HTMLElement.uniqueID执行与@maclema提议类似的操作:

var otherArrayLookup = {};
for (var i=0; i < otherArray.length; i++) {
    otherArrayLookup[otherArray[i].uniqueID] = i;
}

array.sort(function(left, right) {
    return otherArrayLookup[left.uniqueID] < otherArrayLookup[right.uniqueID];
});

您需要在Array.prototype.indexOf支持的案例,HTMLElement.uniqueID支持的案例中添加一些分支(不要在回调函数中添加任何内容,但使用不同的回调函数),以及不属于上述情况。

答案 1 :(得分:1)

您可以尝试制作索引查找对象。这也应该大大提高性能。

var otherArrayLookup = {};
for ( var i=0; i<otherArray.length; i++ ) {
    otherArrayLookup[otherArray[i]] = i;
}

array.sort(function(left, right) {
    return otherArrayLookup[left] < otherArrayLookup[right];
});