以下代码的目的为:编写一个根据不同属性值而定义的排序函数,该排序函数根据输入的属性值对数组中的对象进行从大到小排序
代码如下:
1 function makeComp(para){ 2 //该函数实现将数组中的对象按para这个属性值从大到小排序 3 return function(obj1,obj2){ 4 var x1=obj1.para; 5 var x2=obj2.para; 6 if(x1>x2){ 7 return -1; 8 }else if(x1<x2){ 9 return 1; 10 }else{ 11 return 0; 12 } 13 }; 14 } 15 var arr=[{name:"a",age:20},{name:"b",age:25},{name:"c",age:30}]; 16 var comp=makeComp("age"); 17 arr.sort(comp); 18 console.log(arr);
结果为:
发现结果并未正确进行排序,根本原因在于makeComp函数传入的参数为一个变量para,但由于访问对象中的元素存在两种方法,即.和[],其中.后面不能跟变量,所以在第4,5行var x1=obj1.para中,x1实际的值为undefined,必须改为var x1[para]才能正确取到值。
修改后的代码为:
1 function makeComp(para){ 2 return function(obj1,obj2){ 3 var x1=obj1[para]; 4 var x2=obj2[para];//注意此处修改为中括号,才能正常取值 5 if(x1>x2){ 6 return -1; 7 }else if(x1<x2){ 8 return 1; 9 }else{ 10 return 0; 11 } 12 }; 13 }
运行结果为:
成功进行了排序。
另一个新手经常不注意的点为:代码一中第16行的传入参数不能直接写为age,因为不加引号的话会被系统识别为变量,而实际上不存在该变量。要么创建一个值为"age"的变量,要么直接用字面值"age"进行传值。
原文:https://www.cnblogs.com/hygcoding/p/12981200.html