Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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
如何在IE7JavaScript中对具有未定义元素的数组进行排序_Javascript_Internet Explorer 7 - Fatal编程技术网

如何在IE7JavaScript中对具有未定义元素的数组进行排序

如何在IE7JavaScript中对具有未定义元素的数组进行排序,javascript,internet-explorer-7,Javascript,Internet Explorer 7,我在IE7中对包含未定义元素(稀疏数组)的数组进行排序时遇到问题。当然,这在Safari和Firefox中非常有效,我还没有尝试过其他版本的IE,但这里有一个简单的例子 <html> <head> <script type="text/javascript"> function runscript() { var myArray = [{id: 2}, undefined,

我在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>

函数runscript(){
var myArray=[{id:2},
未定义,
{id:0},
{id:1},
{id:3},
{id:4},
{id:5}];
sort(函数compare(a,b){返回a.id-b.id;});
var输出=“”;
for(myArray中的循环){
输出+=myArray[loop].id+'';
}
警报(输出);
}
结尾的alert()莫名其妙地显示了0 2 3 4 5 1。从数组中删除未定义的元素将对其进行正确排序,警报显示0 1 2 3 4 5


在IE7中有没有办法解决这个问题,这样我就可以可靠地对包含未定义元素的数组进行排序?只要定义的元素排序正确,我不在乎未定义的元素最终会出现在哪里

首先,排序函数是错误的,因为它应该返回-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));
})

尝试将(myArray中的循环)的
更改为(var loop=0;loop的
也许您可以修改比较器

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

嗨,库纳尔,这似乎可行,但我不知道为什么。你能解释一下比较器函数吗?是的。排序的自定义比较器假设只返回整数值(+ve,-ve或0)。在上述场景中,当值(a.id)是未定义的,排序函数返回NaN,这是不正确的。@David,如果您尝试比较if(a.id==10){//do something.}之类的值,它将引发异常。我假设for(myArray中的循环)在排序后将尊重自然数组顺序,事实上,它似乎在Safari、Firefox甚至IE7中都存在(但仅当数组中没有未定义的值时)。如果我按照David的建议执行索引循环,它可以在所有浏览器中运行。太糟糕了,我刚刚开始习惯更紧凑的循环语法。谢谢您的帮助。
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()
myArray.sort(function compare(a, b) { return a.id || 0 - b.id || 0; });