看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()原理排序
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()原理排序
通过方法中value1 = object1[name]="Zachary"
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 }
中
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 传入函数体中,以此来实现动态指派排序键的目的
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);
这个目测应该和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中的位置呢?
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);
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]这样来调用。
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);
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'];
....
}