猿问

函数写完,发现没有起作用,debug了好久,最后还是决定求助imooc的各位了!

看完《javascript语言精粹》中的array.sort(comparefn)一节(Page81),很有启发性,于是自己试着实现这样一个通用函数by:无论数组对象为何种类型,调用此函数就能实现人们一般认知意义上的排序。

	var by = function (name,minor){		return function (a,b){			var objBy =  function (a,b){				var aValue,bValue;			
				aValue = a[name];
				bValue = b[name];				if (aValue === bValue){					return typeof minor === 'function' ? minor(a,b) : 0;
				}				if (typeof aValue === typeof bValue){					return aValue < bValue ? -1 : 1;
				}	
				return typeof aValue < typeof bValue ? -1 : 1;		
			}			var generalBy  = function (a,b){				if (a === b){					return 0;
				}				if (typeof a === 'string' && typeof b === 'string'){					return a.localeCompare(b);
				}				if (typeof a === typeof b){					return a < b ? -1 : 1;
				}	
				return typeof a < typeof b ? -1 : 1;	
			}			
			if (a && b && typeof a ==='object' && typeof b === 'object'){			
				return objBy;
			
			}			return generalBy;	
			
			
		}
		
	
	}	
        //test	
	var arry1 = [8,90,10,2,100,34,35,12];	var arry2 = [4,20,10,34,"hello word","杀星","my god","哈哈哈","高级编程","爱情","四货","一个人" ,"大人"];	var arry3 = [{name:"maggie",sex:"famale",age:43},{name:"gino",sex:"male",age:28},{name:"laura",sex:"famale",age:20},{name:"tino",sex:"male",age:25},{name:"amy",sex:"famale",age:27}];	
	console.log(arry1.sort(by()));	console.log(arry2.sort(by()));	console.log(arry3.sort(by('sex',by('age'))));
茅侃侃
浏览 88回答 1
1回答

心有法竹

这里的by应该返回的是一个比较函数,你这里返回的是一个“返回比较函数”的函数,所以应该改为(注意最后的改动):var&nbsp;by&nbsp;=&nbsp;function&nbsp;(name,&nbsp;minor)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function&nbsp;(a,&nbsp;b)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;objBy&nbsp;=&nbsp;function&nbsp;(a,&nbsp;b)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;aValue,&nbsp;bValue; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aValue&nbsp;=&nbsp;a[name]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bValue&nbsp;=&nbsp;b[name];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(aValue&nbsp;===&nbsp;bValue)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;typeof&nbsp;minor&nbsp;===&nbsp;'function'&nbsp;?&nbsp;minor(a,&nbsp;b)&nbsp;:&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(typeof&nbsp;aValue&nbsp;===&nbsp;typeof&nbsp;bValue)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;aValue&nbsp;<&nbsp;bValue&nbsp;?&nbsp;-1&nbsp;:&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;typeof&nbsp;aValue&nbsp;<&nbsp;typeof&nbsp;bValue&nbsp;?&nbsp;-1&nbsp;:&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;generalBy&nbsp;=&nbsp;function&nbsp;(a,&nbsp;b)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(a&nbsp;===&nbsp;b)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(typeof&nbsp;a&nbsp;===&nbsp;'string'&nbsp;&&&nbsp;typeof&nbsp;b&nbsp;===&nbsp;'string')&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.localeCompare(b); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(typeof&nbsp;a&nbsp;===&nbsp;typeof&nbsp;b)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a&nbsp;<&nbsp;b&nbsp;?&nbsp;-1&nbsp;:&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;typeof&nbsp;a&nbsp;<&nbsp;typeof&nbsp;b&nbsp;?&nbsp;-1&nbsp;:&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(a&nbsp;&&&nbsp;b&nbsp;&&&nbsp;typeof&nbsp;a&nbsp;===&nbsp;'object'&nbsp;&&&nbsp;typeof&nbsp;b&nbsp;===&nbsp;'object')&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;objBy(a,b); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;generalBy(a,b); &nbsp;&nbsp;&nbsp;&nbsp;} }
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答