技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> javascript数组排序的问题

javascript数组排序的问题

浏览:2843次  出处信息

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

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位数    (阅读:10665)
    2. 快速排序(Quicksort)的Javascript实现    (阅读:9933)
    3. 腾讯-1亿个数据取前1万大的整数-题解答    (阅读:8904)
    4. 深入浅出插入类排序算法(直接插入, 折半插入, 希尔排序)    (阅读:6029)
    5. 深入浅出交换类排序算法(冒泡排序,快速排序)    (阅读:5822)
    6. C语言结构体里的成员数组和指针    (阅读:4589)
    7. 为什么数组标号是从0开始的?    (阅读:4593)
    8. 将数组定义为常量    (阅读:4439)
    9. Java程序员必知的8大排序算法    (阅读:4260)
    10. Mysql中的排序优化    (阅读:4173)
    QQ技术交流群:445447336,欢迎加入!
    扫一扫订阅我的微信号:IT技术博客大学习
    << 前一篇:排序算法 Sleep Sort
    © 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

    京ICP备15002552号-1