Internet explorer 11 javascript数组排序无效结果
我正在开发javascript经销商搜索功能: 尝试在“地址”字段中键入“74564”,然后按enter键。结果将按距离对经销商列表进行排序 在IE11上的结果将不同于在其他浏览器上的结果 dealersearch_de_bug.js(第166行)的关键部分: 但当我对它进行两次排序时- dealersearch_de.js第166行:Internet explorer 11 javascript数组排序无效结果,javascript,arrays,sorting,internet-explorer-11,Javascript,Arrays,Sorting,Internet Explorer 11,我正在开发javascript经销商搜索功能: 尝试在“地址”字段中键入“74564”,然后按enter键。结果将按距离对经销商列表进行排序 在IE11上的结果将不同于在其他浏览器上的结果 dealersearch_de_bug.js(第166行)的关键部分: 但当我对它进行两次排序时- dealersearch_de.js第166行: var c_sort = function(a, b) { return a.dist - b.dist; }; markers.sort(c_sor
var c_sort = function(a, b) {
return a.dist - b.dist;
};
markers.sort(c_sort);
var c_sort = function(a, b) {
return a.dist - b.dist;
};
markers.sort(c_sort);
markers.sort(c_sort);
结果与其他浏览器的结果不同且接近
发生了什么?您的
标记
数组中的一个元素具有NaN
值作为dist
属性。(在您当前的测试用例中是markers[482]
)这是在抛弃IE的sort()
函数,在其他浏览器中也是如此
如果在排序之前从数组中删除了任何此类标记,那么它将正确排序。您可以使用if(!isNaN(distance))
测试来完成此操作,在该测试中创建var current
并将其推送到标记
数组
我也同意Curtis关于库修改Array.prototype——这可能是危险的,因为两个库可能会相互碰撞。但这并不是这个特殊问题的原因——如果在没有库的普通测试页面中对标记
数组进行排序,则会出现相同的错误。下面是一个简单的例子:
<!doctype html>
<html>
<head>
<title>Sort Test</title>
</head>
<body>
<script>
function log( array, text ) {
document.write(
'[ ' + array.join(', ') + ' ] ' + text + '<br>'
);
}
var array = [ 3, 9, NaN, 5, 4 ];
log( array, 'original' );
array.sort( function( a, b ) { return a - b; } );
log( array, 'sorted' );
</script>
</body>
</html>
它也无法在Chrome中正确排序:
[ 3, 9, NaN, 5, 4 ] original
[ 3, 9, NaN, 4, 5 ] sorted
和Firefox:
[ 3, 9, NaN, 5, 4 ] original
[ 4, 5, NaN, 3, 9 ] sorted
我怀疑您的页面在其他浏览器中也没有正确排序,只是“足够接近”——除非出于某种原因,NaN
值没有出现在这些浏览器中
为什么NaN
值将排序搞得如此糟糕?排序取决于能够比较数组的任意两个值并得到一致的结果:小于、大于或等于
但是NaN
不像普通数字那样工作。您可以将任何值与NaN
进行比较,结果总是false
,无论比较是什么-即使您与相同的NaN
值进行比较:
console.log( NaN == NaN ); // false!
类似地,如果在表达式中添加或减去
NaN
,结果总是得到NaN
。所有这些都会对排序函数造成严重破坏,无论它使用比较还是减法。为什么不使用返回a.dist-b.dist代码>?没什么区别,我两个都试过了。你看了它们有什么不同吗?如果两个标记具有相同的距离,则无法保证它们的显示顺序,两次排序很可能会给出不同的排序顺序Array。sort()
适用于给定的数组。不需要配置。您的网站似乎超载了主数组构造函数。在IE的排序中,可能会添加一个附加函数(例如,_each)。您还从不同的地方加载了几十个脚本(顺便说一句,all.js被加载了两次),因此没有花一个小时的时间,我甚至找不到库在做什么。在你的位置上,我要做的第一件事是尝试关闭它,看看IE行为是否发生了变化。不仅NaN
会制作有趣的东西,而且会制作缺少属性的对象。
console.log( NaN == NaN ); // false!