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