Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Internet explorer 11 javascript数组排序无效结果_Javascript_Arrays_Sorting_Internet Explorer 11 - Fatal编程技术网

Internet explorer 11 javascript数组排序无效结果

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

我正在开发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_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!