看JavaScript高级程序设计时候有一个问题:sort()在传入一个比较方法时候可以实现自定义的排序,书上的代码是01 function compare(value1, value2){
02     if(value1 < value2){
03         return -1;
04     }else if(value1 > value2){
05         return 1;
06     }else{
07         return 0;
08     }
09 }
10 var values = [0, 1, 5, 10, 15];
11 values.sort(compare);
12 alert(values); //15, 10, 5, 1, 0这里我还能勉强猜测sort()内部把每数组的每相邻的两个值作为参数传了进来。但是后面有一段代码让我很不能不能理解,也感到了自己的猜测不正确。01 function createComparisonFunction(propertyName){
02     return function(object1, object2){
03         var value1 = object1[propertyName];
04         var value2 = object2[propertyName];
05         if(value1 < value2){
06             return -1;
07         }else if(value1 > value2){
08             return 1;
09         }else{
10             return 0;
11         }
12     };
13 }
14  
15 var data = [{name : "Zachary", age : 28}, {name : "Nicholas", age : 29}];
16 data.sort(createComparisonFunction("name"));
17 alert(data[0].name);   //Nicholas
18 data.sort(createComparisonFunction("age"));
19 alert(data[0].name)   //Zachary这里object1与object2是怎么与data中的两组数据对应上的?冰天雪地团身后空翻2周半转体720度半luogui求。大家帮帮忙吧 JavaScriptsort()原理排序

解决方案 »

  1.   

    本帖最后由 net_lover 于 2013-05-10 16:26:18 编辑
      

  2.   

    通过propertyName 也就是你createComparisonFunction("name").object1 = {name : "Zachary", age : 28}
    通过方法中value1 = object1[name]="Zachary"
      

  3.   

    function createComparisonFunction(propertyName){
    02        return function(object1, object2){
    03            var value1 = object1[propertyName];
    04            var value2 = object2[propertyName];
    05            if(value1 < value2){
    06                return -1;
    07            }else if(value1 > value2){
    08                return 1;
    09            }else{
    10                return 0;
    11            }
    12        };
    13    }
      

  4.   

    今天还没有回帖,借贵宝地回帖一下,我回头看看这个sort如何实现。
      

  5.   

    data.sort(createComparisonFunction("name"));

    createComparisonFunction("name") 返回的是一个函数
    相当于第一段代码中的 compare(value1, value2)
    实际执行回调的是返回的函数
    function(object1, object2){
      var value1 = object1[propertyName];
      var value2 = object2[propertyName];
      if(value1 < value2){
      return -1;
    }else if(value1 > value2){
      return 1;
    }else{
      return 0;
    }
    他这样做的原因是要把 name 传入函数体中,以此来实现动态指派排序键的目的
      

  6.   

    如果改写成这样,那么理解起来就没有问题了吧function compare(object1, object2){
      var value1 = object1[propertyName];
      var value2 = object2[propertyName];
      if(value1 < value2){
        return -1;
      }else if(value1 > value2){
        return 1;
      }else{
        return 0;
      }
    }
    var data = [{name : "Zachary", age : 28}, {name : "Nicholas", age : 29}];
    propertyName = "name"; //这个全局的变量承载的是排序键,compare 中要用到
    data.sort(compare);
      

  7.   

    这个目测应该和java里面的差不多
      

  8.   


    这个目测应该和java里面的差不多

    首先,谢谢几位前辈耐心解答。
    是这样的,我的一文不在于object1[propertyName]怎样变成values[0]["name"]。
    而是在于object1如何与values[0]关联起来的,所有的代码中并没有看到object1=values[0]这样的代码呀。
    是在sort()内部有类似的代码?可那又是怎样的呢?
    毕竟第一段代码中嗨吧数组元素作为value1,value2两个参数传了进去,可第二段代码完全没有传数组元素。
    之前有看执行环境,作用域链,所以不由自主地想往这上面靠,但是又靠不上去,还有点乱,这么想还不知道对不对。
    就拿第一段代码来说,自己猜测sort()的实现是先拿value1 = values[0];value2 = values[1];作比较,然后value1 = values[1];value2 = values[2];作比较,有点冒泡的感觉,估计这猜测也是错误的……因为第二段代码中的比较方法连给values[]数组元素作为参数穿进去的代码都没有。难道是默认传了,用arguments获取的?那又是怎么确定在arguments中的位置呢?
      

  9.   

    我有点笨……真心从这个return上悟不出什么
      

  10.   

    那么写成这样你能理解吗?
    var data = [{name : "Zachary", age : 28}, {name : "Nicholas", age : 29}];
    propertyName = "name"; //这个全局的变量承载的是排序键,compare 中要用到
    data.sort(function (object1, object2){
      var value1 = object1[propertyName];
      var value2 = object2[propertyName];
      if(value1 < value2){
        return -1;
      }else if(value1 > value2){
        return 1;
      }else{
        return 0;
      }
    });
    alert(data[0].name);
      

  11.   

    根据return的值来确定相邻的2个元素是否需要换位置。至于你说的不知道object1跟数组元素是怎么关联起来的,我想你研究一下回调函数应该就明白了。用伪代码表示一下就是:Array.prototype.sort = function(fn){
       for(var i=0,len=this.length;i<len;i++){
           var result = fn(this[i],this[i+1]);
           if(result==1) //换位置
       }
    }
    当然以上代码肯定是做不到sort的功能的,意思就是这样。在你的例子里,数组里都是一个一个对象,所以fn接受到的参数就是一个一个对象,所以object1,object2就可以object1[propertyName]这样来调用。
      

  12.   

    var data = [{name : "Zachary", age : 28}, {name : "Nicholas", age : 29}];
    propertyName = "name"; //全局变量
    data.sort(function (object1, object2){
      var value1 = object1[propertyName]; //propertyName 全局变量
      var value2 = object2[propertyName];
      if(value1 < value2){
        return -1;
      }else if(value1 > value2){
        return 1;
      }else{
        return 0;
      }
    });
    alert(data[0].name);
      

  13.   

    至于你说的第二段代码没传数组元素,我想你是没搞清楚
    data.sort(createComparisonFunction("name"));这里的执行过程是:
    1.执行createComparisonFunction("name")方法,将name传进函数
    2.将createComparisonFunction("name")返回值当做参数传给data.sort因为createComparisonFunction("name")返回值是一个函数,所以就等同于data.sort(function(object1,object2){})只不过这里把name当参数传进去之后,你可以理解为返回的函数就是
    function(object1,object2){
        var value1 = object1['name'];
        var value2 = object2['name'];
        ....
    }