zoukankan      html  css  js  c++  java
  • javascript中sort()排序的一些理解

    sort()方法对一个数组进行排序,并可以接受一个比较函数,最后返回一个排序的数组。

    1.sort()有自身默认的比较函数,该函数把排序的元素都看作字符串。

    var s = [5, 4, 3, 2, 1];
    s.sort();
    console.log(s);
    //=>[ 1, 2, 3, 4, 5 ]

    改变排序数组:

    var s = [2, 4, 5, 1, 12, 3, 13];
    s.sort();
    console.log(s);
    //=>[ 1, 12, 13, 2, 3, 4, 5 ]

    明显地,大多数情况下sort()方法不能得到理想排序的数组。但是,可以通过为sort()方法传入不同的比较函数,以得到合适的排序结果。

    2.为sort()方法传入新的比较函数。

    var s = [2, 4, 5, 1, 12, 3, 13];
    s.sort(function(a, b) {
        return a - b;
    });
    console.log(s);
    //=>[ 1, 2, 3, 4, 5, 12, 13 ]

    其中,比较函数接受两个参数a,b。当比较函数返回0时,表示a=b;返回正数时,表示a>b;返回负数时,表示a<b。

    当然,以下方式也有相同的效果:

    var s = [2, 4, 5, 1, 12, 3, 13];
    s.sort(function(a, b) {
        if(a == b)
            return 0;
        else 
            return a < b ? -1 : 1;
    });
    console.log(s);
    //=>[ 1, 2, 3, 4, 5, 12, 13 ]

    再次改变排序数组,其包含不止一种数据:

    var s = [2, 4, 5, 'b', 1, 'a', 12, 3, 13];
    s.sort(function(a, b) {
        return a - b;
    });
    console.log(s);
    //=>[ 2, 4, 5, 'b', 1, 'a', 3, 12, 13 ]

    数组再次变得杂乱无章,因此,可以再修改比较函数,以达到预期效果。

    3.使sort()适用于简单数据类型的数组排序。

    var s = [2, 4, 5, 'b', 1, 'a', 12, 3, 13];
    s.sort(function(a, b) {
        if(a === b)
            return 0;
        if(typeof a === typeof b)         //当数据类型相同时,判断先后位置
            return a < b ? -1 : 1; 
        return typeof a < typeof b ? -1 : 1;  //确定不同类型数据的先后顺序,此例为Number在前,String在后
    });
    console.log(s);
    //=>[ 1, 2, 3, 4, 5, 12, 13, 'a', 'b' ]

    由本例可知,可先对传入参数进行类型判断,再进行排序,即可以得到一定排序方式的结果。

    同样地,通过比较函数,我们可以对对象数组进行排序。

    4.用sort()方法排序对象数组

     1 var s = [
     2     {'year': 1993, 'sex': 'man', 'name': '张三'},
     3     {'year': 1992, 'sex': 'woman', 'name': '李红'},
     4     {'year': 1991, 'sex': 'man', 'name': '赵四'},
     5     {'year': 1993, 'sex': 'woman', 'name': '吴用'}
     6 ];
     7 var byRule = function(rule) {
     8     return function(a, b) {
     9         var i, j;
    10         if(typeof a === 'object' && typeof b === 'object') {
    11             i = a[rule];
    12             j = b[rule];
    13             if(i === j)
    14                 return 0;
    15             if(typeof i === typeof j) {
    16                 return i < j ? -1 : 1;
    17             }
    18             return typeof i < typeof j ? -1 : 1;
    19         }
    20     };
    21 };
    22 s.sort(byRule('year'));
    23 console.log(s);
    24 //=>[ { year: 1991, sex: 'man', name: '赵四' },
    25       { year: 1992, sex: 'woman', name: '李红' },
    26       { year: 1993, sex: 'man', name: '张三' },
    27       { year: 1993, sex: 'woman', name: '吴用' } ]

    先定义了一个函数byRule,该函数返回一个排序函数,从而可以通过传入不同的排序规则至byRule函数来得到不同的排序函数。

    观察26,27行代码,其中year相同:

    26       { year: 1993, sex: 'man', name: '张三' },
    27       { year: 1993, sex: 'woman', name: '吴用' } ]

    可以再对byRule函数添加一个参数,使得第一个键值已派序时,对相同的元素进行下一个键值对的排序:

     1 var s = [
     2     {'year': 1993, 'sex': 'man', 'name': '张三'},
     3     {'year': 1992, 'sex': 'woman', 'name': '李红'},
     4     {'year': 1991, 'sex': 'man', 'name': '赵四'},
     5     {'year': 1993, 'sex': 'woman', 'name': '吴用'}
     6 ];
     7 var byRule = function(rule, next) {
     8     return function(a, b) {
     9         var i, j;
    10         if(typeof a === 'object' && typeof b === 'object') {
    11             i = a[rule];
    12             j = b[rule];
    13             if(i === j)
    14                 return typeof next === 'function' ? next(a, b) : 0 ;  //第一对键值相同时,继续比较第二对键值
    15             if(typeof i === typeof j) {
    16                 return i < j ? -1 : 1;
    17             }
    18             return typeof i < typeof j ? -1 : 1;
    19         }
    20     };
    21 };
    22 s.sort(byRule('year', byRule('name')));    //byRule函数接受两个参数,第二个参数为一个函数
    23 console.log(s);
    24 //=>[ { year: 1991, sex: 'man', name: '赵四' },
    25       { year: 1992, sex: 'woman', name: '李红' },
    26       { year: 1993, sex: 'woman', name: '吴用' },            
    27       { year: 1993, sex: 'man', name: '张三' } ]

    与上例对比,26,27行的顺序已改变。

    5.讨论一下sort()的排序方式。

    本例测试在sublime text 3 中进行。

    • 当排序数组元素不大于10个时:
    var s = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
    s.sort(function(a, b) {
        if(a == b) {
            console.log(a + "=" + b);
            return 0;
        }
        if(a < b) {
            console.log(a + "<" + b);
            return -1;
        }
        if(a > b) {
            console.log(a + ">" + b);
            return 1;
        }
    });
    console.log(s);

    结果:

    10>9
    10>8
    9>8
    10>7
    9>7
    8>7
    10>6
    9>6
    8>6
    7>6
    10>5
    9>5
    8>5
    7>5
    6>5
    10>4
    9>4
    8>4
    7>4
    6>4
    5>4
    10>3
    9>3
    8>3
    7>3
    6>3
    5>3
    4>3
    10>2
    9>2
    8>2
    7>2
    6>2
    5>2
    4>2
    3>2
    10>1
    9>1
    8>1
    7>1
    6>1
    5>1
    4>1
    3>1
    2>1
    [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

    可见,其排序方式为典型的插入排序

    • 当排序数组元素为11个(或11个以上)时:
    var s = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
    s.sort(function(a, b) {
        if(a == b) {
            console.log(a + "=" + b);
            return 0;
        }
        if(a < b) {
            console.log(a + "<" + b);
            return -1;
        }
        if(a > b) {
            console.log(a + ">" + b);
            return 1;
        }
    });
    console.log(s);

    结果:

    11>1
    1<6
    11>6
    9>6
    2<6
    8>6
    3<6
    7>6
    4<6
    10>6
    5<6
    1<2
    2<3
    3<4
    4<5
    10>7
    10>8
    7<8
    10>9
    8<9
    10<11
    [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]

    可见,其排序方式为快速排序

    -------------------------------------------------------------------------------------------------------

    注:本文为个人学习随笔,仅供个人学习使用,如有雷同,纯属巧合,敬请原谅!

  • 相关阅读:
    关于sqlite数据库在使用过程中应该注意以下几点
    关于THREAD线程中CurrentCulture与CurrentUICulture的学习
    转:ASP.NET MVC3升级到ASP.NET MVC4
    win8 iis安装及网站发布
    转: CKEditor/CKFinder升级心得
    [更新]Windows Phone 实现类似“微博”下拉刷新效果
    EntityFramework中使用Include可能带来的问题
    [更新]Luke.Net for Pangu 盘古分词版更新
    文件大小友好显示类
    找出最慢的查询语句Find your slowest queries
  • 原文地址:https://www.cnblogs.com/alicell/p/9071791.html
Copyright © 2011-2022 走看看