IT技术博客大学习 共学习 共进步

javascript数组排序的问题

RockUX | WEB、前端、JavaScript、PHP 2011-06-23 13:42:28 浏览 3,842 次

    看看下面的代码,你觉得输出是什么呢?

1
2
3
var a = [30,2,1,9,15];  
a.sort();  
alert(a);

    如果你觉得输出是1,2,9,15,30,那就错了,真正的结果是1,15,2,30,9。不过,在没真正搞清楚javascript的数组排序之前还是先别放弃这个强大的语言。

    那么这是怎么回事呢?当排序的方法没有参数的时候,所有的值都会被转化成为字符串,然后根据字典顺序排序。所以15会排在2前面,10和19999也一样。

    为了解决这个问题,我们需要给sort()方法传递一个比较函数,这个函数需要两个参数,我们暂且命名为a和b,然后返回:

  • 如果a
  • 如果a>b,那么返回一个正数。
  • 如果a=b,就返回0。
  •     最简单的数字比较的函数如下:

    1
    2
    3
    function compare(a,b){
        return a-b;
    }

        我们可以直接把比较函数写在sort里面作为参数传入:

    1
    2
    3
    var a = [30,2,1,9,15];  
    a.sort(function(a,b) { return a-b; });  
    alert(a);

        现在的结果就是1,2,9,15,30了

        排序函数另外一个强大的地方在于,他可以比较任何类型的对象的任何属性。我们看看下面的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    // location co-ordinates  
    var locations = [  
        { name: "shops", x:3, y:4 },  
        { name: "library", x:5, y:3 },  
        { name: "pub", x:1, y:2 }  
    ];  
    // home co-ordinates  
    var home = { name: "home", x:0, y:0 };

        然后我们定义一个公式来比较:

    1
    2
    3
    function distance(p1,p2){
    return Math.sqrt(Math.pow(p1.x-p2.x,2)+Math.pow(p1.y-p2.y,2)); 
    }

        现在我们就可以根据离家距离来排序了。

    1
    2
    3
    4
    5
    6
    locations.sort(  
        function(a, b) {  
            return distance(home,a)-distance(home,b);  
        }  
    );  
    // locations sorted: pub, shops, library

        或者也可以由远到近的距离排序。

    1
    2
    3
    4
    5
    6
    locations.sort(  
        function(b, a) {  
            return distance(home,a)-distance(home,b);  
        }  
    );  
    // locations sorted: pub, shops, library

        或者根据字母顺序来对地点排序。

    1
    2
    3
    4
    5
    6
    7
    8
    locations.sort(  
        function(a, b) {  
            if (a.name < b.name) return -1;  
            if (a.name > b.name) return 1;  
            return 0;  
        }  
    );  
    // locations sorted: library, pub, shops

        基于javascript的数组排序,我们可以很容易的开发出可以重复使用、可用于任何对象、对象属性的排序方法。从这点上来说,javascript的排序比其他语言的更加灵活。

    建议继续学习

    1. 如何使用1M的内存排序100万个8位数 (阅读 12,222)
    2. 快速排序(Quicksort)的Javascript实现 (阅读 11,542)
    3. 腾讯-1亿个数据取前1万大的整数-题解答 (阅读 9,943)
    4. 深入浅出插入类排序算法(直接插入, 折半插入, 希尔排序) (阅读 7,423)
    5. 深入浅出交换类排序算法(冒泡排序,快速排序) (阅读 6,982)
    6. 为什么数组标号是从0开始的? (阅读 6,162)
    7. C语言结构体里的成员数组和指针 (阅读 6,081)
    8. Java程序员必知的8大排序算法 (阅读 5,561)
    9. 将数组定义为常量 (阅读 5,542)
    10. Mysql中的排序优化 (阅读 5,521)