Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为IE优化简单的双for循环 array.sort(函数(左、右){ 返回索引(otherArray,左)_Javascript_Internet Explorer_Optimization - Fatal编程技术网

Javascript 为IE优化简单的双for循环 array.sort(函数(左、右){ 返回索引(otherArray,左)

Javascript 为IE优化简单的双for循环 array.sort(函数(左、右){ 返回索引(otherArray,左),javascript,internet-explorer,optimization,Javascript,Internet Explorer,Optimization,这是O(len(array)^2)因此,对于len=1000的合理大小数组,需要恒定*100万次运算,这很容易超过IE 500万次运算的上限 因此,IE抛出脚本的时间太长,即使这样做很快 问题是IE没有自己的Array.prototype.indexOf,因此我不能将操作计数减少到O(len(Array),而是使用双for循环而不是单for循环 我考虑了array.join和String.prototype.indexOf,但是数组中的对象是DOM元素,您无法(轻松地)将它们转换为字符串 告诉I

这是
O(len(array)^2)
因此,对于len=1000的合理大小数组,需要恒定*100万次运算,这很容易超过IE 500万次运算的上限

因此,IE抛出脚本的时间太长,即使这样做很快

问题是IE没有自己的
Array.prototype.indexOf
,因此我不能将操作计数减少到
O(len(Array)
,而是使用双for循环而不是单for循环

我考虑了array.join和String.prototype.indexOf,但是数组中的对象是DOM元素,您无法(轻松地)将它们转换为字符串


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

您可以尝试创建索引查找对象。这也会大大提高性能

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

对于(var i=0;i我可以想到两种可能的解决方案:一种在任何地方都可以使用,另一种完全是IE专有的(我希望在IE9中不起作用,但它支持
Array.prototype.indexOf
,所以这不是问题)

第一个更简单的解决方案是只在每个HtmleElement上设置一个所需顺序的属性并按此顺序排序。如果您关心所需顺序的持久化,则必须确保HtmleElement对象不会被垃圾收集,因此您必须保留对它们的引用(可能最简单的方法是在全局范围内为其创建一个数组)

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

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

array.sort(function(left, right) {
    return otherArrayLookup[left] < otherArrayLookup[right];
});
var otherArrayLookup={};
for(var i=0;i

您需要在其中添加一些分支(不要在回调函数中添加分支,而是使用不同的回调函数)对于
Array.prototype.indexOf
受支持的情况,支持
HTMLElement.uniqueID
的情况,以及上述情况中的none.

但这实际上不起作用-看看其他ArrayLookup会变成什么:它类似于
{“[object HTMLBodyElement]”:1,“[object HTMLHeaderElement]”:2}
即使otherArray中有更多的元素。更像O(n log n)。但比O(n^2)更好@gsnedders有一个很好的观点。它不起作用,每行都需要一个唯一的id。啊,是的,你是对的,它不起作用。我实际上在考虑Actionscript。
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];
});