我在排序一个阵列时遇到了麻烦,该数组包括IE7中的未定义元素(稀疏阵列)。当然,这在Safari和Firefox中都很出色,而且我没有尝试过IE的其他版本,但这是一个简单的例子。

<html>
<head>
<script type="text/javascript">
function runscript() {
    var myArray = [{id: 2},
                        undefined,
                        {id: 0},
                        {id: 1},
                        {id: 3},
                        {id: 4},
                        {id: 5}];
    myArray.sort(function compare(a, b) { return a.id - b.id; });
    var output = '';
    for (loop in myArray) {
        output += myArray[loop].id + ' ';
    }
    alert(output);
}
</script>
</head>
<body onLoad="runscript();">
</body>

末尾的alert()莫名其妙地显示0 2 3 4 5 1.从数组中删除未定义的元素,并将其分类为0 1 2 3 4 5。

有没有办法在IE7中解决此问题,以便可以可靠地排序包含未定义元素的数组?我不在乎未定义的元素最终到达哪里,只要定义的元素正确排序即可。

有帮助吗?

解决方案

尝试更改 for (loop in myArray)for (var loop=0; loop<myArray.length; loop++):

function runscript() {
    var myArray = [{id: 2},
                        undefined,
                        {id: 0},
                        {id: 1},
                        {id: 3},
                        {id: 4},
                        {id: 5}];
    myArray.sort(function compare(a, b) { return a.id - b.id; });
    var output = '';
    for (var loop=0; loop<myArray.length; loop++) {
        output += (myArray[loop]||{id: 'undefined'}).id + ' ';
    }
    alert(output);
}
runscript()

使用时 for (x in object) 这些物品不能保证按顺序排列。也可以看看 为什么在阵列迭代中使用“ for ... in ... in ... in ... in ... in ... in ... in in in in in in in in in in in in in in in in in in in in in in in in in in ...

(上述警报 0 1 2 3 4 5 undefined)

编辑: 未删除 - 我已经测试了上述内容:P

其他提示

也许您可以修改比较器

myArray.sort(function compare(a, b) { return a.id || 0 - b.id || 0; });

首先,您的排序功能是错误的,因为预计将返回-1、0或+1,而不是布尔值。
改用此

var arr = [.....]
arr.sort((function(a, b){
    if (!a || !b) {
        // Here you choose how to treat undefined/null elements
        return 0;
    }  
    return (a[index].id === b[index].id ? 0 : (a[index].id < b[index].id ? -1 : 1));
})

但是,为了使您知道,当您尝试返回时,您的循环将会丢失错误 id 来自未定义元素的属性。另外,您永远不要使用 for..in 循环迭代在数组上,使用带有增量索引的循环或相反的循环

var l = arr.length; 
while (l--) {
    ..
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top