javascript深度理解数组排序

今天查到数组的sort函数可以接受自定义比较函数,这真是一件妙事儿。

这样对(数字类型表示范围以内的)数字进行排序就变得极为简单了。


  1. var myArray = [-80,-13.888,-10,-9.6,-9.4,-1,2,2,3,5.823,7.999,20,0,22,55,312];  
  2. iJs.put(myArray.sort(function(a,b){return a-b})); 

 调试信息: 
    -80,-13.888,-10,-9.6,-9.4,-1,0,2,2,3,5.823,7.999,20,22,55,312

如果想降序,a-b改为b-a即可:


  1. var myArray = [-80,-13.888,-10,-9.6,-9.4,-1,2,2,3,5.823,0,7.999,20,22,55,312];  
  2. iJs.put(myArray.sort(function(a,b){return b-a}));//此处为b-a 
调试信息: 
    312,55,22,20,7.999,5.823,3,2,2,0,-1,-9.4,-9.6,-10,-13.888,-80

构造返回比较函数的函数,可以达到更为灵活的目的。为此我写了一个一维二维数组通用的排序函数如下(未经充分测试,如用于生产,最好再测一下啊):


  1. //类型相同则比大小,升降由option的第一个参数指定  
  2. //类型不同则比类型,升降由option的第二个参数指定  
  3. //如果是对象或数组,则按name指定属性或元素参与排序  
  4. //比大小结果相同则按照secondby指定的规则排序  
  5. var by = function(name,option,secondby){  
  6.     return function(o,p){  
  7.         var a,b;  
  8.         var sign=1;//调节顺序  
  9.         var r;//保存返回值  
  10.  
  11.         //如果是对象或数组,则按name指定属性或元素参与排序  
  12.         if(o && typeof o === 'object'){  
  13.             a = o[name];  
  14.         }else{  
  15.             a = o;  
  16.         }  
  17.         if(p && typeof p === 'object'){  
  18.             b = p[name];  
  19.         }else{  
  20.             b = p;  
  21.         }  
  22.  
  23.         if(typeof a === typeof b){  
  24.             //升降由option的第一个参数指定  
  25.             switch(option[0]){  
  26.                 case "desc" :   
  27.                     sign = 1;  
  28.                     break;  
  29.                 case "asc" :  
  30.                     sign = -1;  
  31.                     break;  
  32.                 default:  
  33.                     sign = 1;//默认  
  34.             }             
  35.         }else{  
  36.             //类型不同则比类型  
  37.             a = typeof a;  
  38.             b = typeof b;  
  39.             //升降由option的第二个参数指定  
  40.             switch(option[1]){  
  41.                 case "desc" :   
  42.                     sign = 1;  
  43.                     break;  
  44.                 case "asc" :  
  45.                     sign = -1;  
  46.                     break;  
  47.                 default:  
  48.                     sign = 1;//默认  
  49.             }  
  50.         }  
  51.  
  52.         if(a === b){
  53.             //递归支持多个参数排序(20121231补充:如果传进来不是by则不是递归)
  54.             r = typeof secondby === "function" ? secondby(o,p):0;  
  55.         }else if(a<b){  
  56.             r = 1*sign;  
  57.         }else{  
  58.             r = -1*sign;  
  59.         }  
  60.  
  61.         return r;  
  62.     }  
  63. }  
  64.  
  65. //判断是否数组  
  66. var is_array = function(value){  
  67.     return value && //有值  
  68.         typeof value === "object" && //typeof查出类型为object  
  69.         typeof value.length === "number" && //length属性是number类型  
  70.         typeof value.splice === "function" && //有splice方法  
  71.         !(value.propertyIsEnumerable("length"))//length是一个不可枚举的属性  
  72. }  
  73.  
  74. //输出二维数组  
  75. var puts = function(myObj){  
  76.     for(var i=0;i<myObj.length;i+=1){  
  77.         var tmp = "";  
  78.         if(is_array(myObj[i])){  
  79.             for(var j=0;j<myObj[i].length;j+=1){  
  80.                 tmp = tmp + myObj[i][j] + ",";  
  81.             }  
  82.         }else{  
  83.             for(name in myObj[i]){  
  84.                 tmp = tmp + name + ":" + myObj[i][name] + ",";  
  85.             }             
  86.         }  
  87.         iJs.put(tmp);  
  88.     }  
  89. }  
  90.  
  91.  
  92. var myArray=new Array();  
  93.  
  94. //例1  
  95. myArray = [  
  96.     {"a":1,"b":1,"c":1},  
  97.     {"a":3,"b":3,"c":1},  
  98.     {"a":3,"b":4,"c":1},  
  99.     {"a":3,"b":1,"c":1},  
  100.     {"a":2,"b":1,"c":2},  
  101.     {"a":2,"b":1,"c":1},  
  102. ];  
  103. myArray = myArray.sort(  
  104.     by("a",["asc"],  
  105.     by("b",[],  
  106.     by("c",["asc"])))  
  107. );  
  108. puts(myArray);  
  109.  
  110.  
  111. //例2  
  112. myArray = [  
  113.     [1,1,1],  
  114.     [3,3,1],  
  115.     [3,4,1],  
  116.     [3,1,1],  
  117.     [2,1,2],  
  118.     [2,1,1]  
  119. ];  
  120. myArray = myArray.sort(  
  121.     by(0,["asc"],  
  122.     by(1,[],  
  123.     by(2,["asc"])))  
  124. );  
  125. puts(myArray);  
  126.  
  127.  
  128. //例3  
  129. myArray = [-80,-13.888,-10,-9.6,-9.4,-1,2,2,3,5.823,0,7.999,20,22,55,312];  
  130. myArray = myArray.sort(  
  131.     by(null,["asc"])  
  132. );  
  133. iJs.put("");  
  134. iJs.put(myArray); 
调试信息: 
    a:1,b:1,c:1,
    a:2,b:1,c:1,
    a:2,b:1,c:2,
    a:3,b:4,c:1,
    a:3,b:3,c:1,
    a:3,b:1,c:1,
    
    1,1,1,
    2,1,1,
    2,1,2,
    3,4,1,
    3,3,1,
    3,1,1,
    
    -80,-13.888,-10,-9.6,-9.4,-1,0,2,2,3,5.823,7.999,20,22,55,312

想获得全部可执行代码,请下载附件。

附件:http://down.51cto.com/data/2362064




 本文转自 hexiaini235 51CTO博客,原文链接:http://blog.51cto.com/idata/1104810,如需转载请自行联系原作者


上一篇:ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库


下一篇:PHP实现跨域自动登录