JavaScript中sort()排序时传入参数的问题

Z_wenuw 发布于 2013/05/10 11:06
阅读 2K+
收藏 0

看JavaScript高级程序设计时候有一个问题:

sort()在传入一个比较方法时候可以实现自定义的排序,书上的代码是

function compare(value1, value2){
    if(value1 < value2){
        return -1;
    }else if(value1 > value2){
        return 1;
    }else{
        return 0;
    }
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); //15, 10, 5, 1, 0
这里我还能勉强猜测sort()内部把每数组的每相邻的两个值作为参数传了进来。但是后面有一段代码让我很不能不能理解,也感到了自己的猜测不正确。
function createComparisonFunction(propertyName){
    return 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;
        }
    };
}

var data = [{name : "Zachary", age : 28}, {name : "Nicholas", age : 29}];
data.sort(createComparisonFunction("name"));
alert(data[0].name);   //Nicholas
data.sort(createComparisonFunction("age"));
alert(data[0].name)   //Zachary
这里object1与object2是怎么与data中的两组数据对应上的?

冰天雪地团身后空翻2周半转体720°C半luogui求。大家帮帮忙吧

加载中
0
Z_wenuw
Z_wenuw

引用来自“JustForFly”的答案

以data.sort(createComparisonFunction("name"))为例,

等同于:

data.sort(function(object1, object2){
        var value1 = object1["name"];
        var value2 = object2["name"];
        if(value1 < value2){
            return -1;
        }else if(value1 > value2){
            return 1;
        }else{
            return 0;
        }
    });

object1,object1代表{name :"Zachary", age : 28} {name :"Nicholas", age : 29}

那么data.sort(createComparisonFunction("name"))就是通过比较数组的中的2个对象{name :"Zachary", age : 28} {name :"Nicholas", age : 29}的name属性来排序。

类似的data.sort(createComparisonFunction("age"))就是通过比较数组的中的2个对象{name :"Zachary", age : 28} {name :"Nicholas", age : 29}的age属性来排序。

嘿嘿,谢谢~。

我的问题就在于object1为什么代表了{name :"Zachary", age : 28},或者{name :"Nicholas", age : 29},没看到显式地给他们关联起来。如果是sort()内部实现的话,我想知道大概怎么实现。如果不是sort()内部实现,我想知道怎么实现问题有点多~不过现在明白一些了。

Z_wenuw
Z_wenuw
谢谢~
JustForFly
JustForFly
你可以理解成数组里面存放的都是对象Object,就像javascript里面定义对象,可以用 var o = new Object(); 也可以用 var o = {}; sort()方法只要去偏离data,一个一个的取出数组里面的对象(不论是基本类型,还是Object),将他们赋值给object1和object2,这样就可以轮循去比较他们了。
0
JustForFly
JustForFly

以data.sort(createComparisonFunction("name"))为例,

等同于:

data.sort(function(object1, object2){
        var value1 = object1["name"];
        var value2 = object2["name"];
        if(value1 < value2){
            return -1;
        }else if(value1 > value2){
            return 1;
        }else{
            return 0;
        }
    });

object1,object1代表{name :"Zachary", age : 28} {name :"Nicholas", age : 29}

那么data.sort(createComparisonFunction("name"))就是通过比较数组的中的2个对象{name :"Zachary", age : 28} {name :"Nicholas", age : 29}的name属性来排序。

类似的data.sort(createComparisonFunction("age"))就是通过比较数组的中的2个对象{name :"Zachary", age : 28} {name :"Nicholas", age : 29}的age属性来排序。

返回顶部
顶部