代码之家  ›  专栏  ›  技术社区  ›  Gene Goykhman

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

  •  0
  • Gene Goykhman  · 技术社区  · 15 年前

    <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中有没有解决这个问题的方法,以便我可以可靠地对包含未定义元素的数组进行排序?只要定义的元素排序正确,我不在乎未定义的元素最终会出现在哪里。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

    尝试改变 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) 这些东西不能保证井然有序。另请参见 Why is using "for...in" with array iteration a bad idea?

    0 1 2 3 4 5 undefined )

    编辑:

        2
  •  1
  •   Kunal    15 年前

    myArray.sort(function compare(a, b) { return a.id || 0 - b.id || 0; });
    
        3
  •  0
  •   Sean Kinsey    15 年前


    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--) {
        ..
    }