js 基础——sort方法:
arrayObject.sort(sortby);
参数:定义排序规则(正序、倒序、按字段排序)的函数;
返回值:对数组的引用。请注意,数组在原数组上进行排序,不生成副本。
无参数时,默认为正序排序(数值数组按数值正序,字符串数组按字符正序)。
要实现不同的排序方式,只需实现sort的输入参数函数即可。
sort()方法:默认将数组中的所有元素转为字符串后再排列(默认是升序),用来排列字符串类型的元素
比如如果是字符串形式:
//正序
var letter = ['s','q','a','v','c','b']; //字母
letter.sort();
//["a", "b", "c", "q", "s", "v"]
//倒序
var letter = ['s','q','a','v','c','b']; //字母
letter.sort();
letter.reverse();
//["v", "s", "q", "c", "b", "a"]
这里成功的进行了排序,但是如果换一个数组:
var array=[123,222,7,67,3,58,92];
array.sort();
//[123,222,3,58,67,7,92]
结果就没有成功排序,原因是什么?
因为sort()进行的字符串的排序,字符串之间的比较是Unicode码的比较,所以无法完成这个数组的排序,如何解决这个问题?
解决的办法就是使用自定义比较器:
自定义比较器的默认公式:
function cmp(a,b){return a-b};
正序排序:
//定义正序规则的参数函数
function NumAscSort(a,b)
{
return a - b;
}
var arr = new Array( 18,48,42,12,18,21,45,33); //进行正序排序
arr.sort(NumAscSort);//直接将函数放入sort内,不要加括号!!!
//[12, 18, 18, 21, 33, 42, 45, 48]
倒序排序:
//定义正序规则的参数函数
function NumDescSort(a,b)
{
return b - a;
}
var arr = new Array( 18,48,42,12,18,21,45,33); //进行正序排序
arr.sort(NumDescSort);
//[48, 45, 42, 33, 21, 18, 18, 12]
这次,我们成功的利用自定义比较器进行了排序
1.自定义比较器的原理:
两个参数a,b
如果a>b 则a-b>0 返回一个正数
如果a<b 则a-b<0 返回一个负数
如果a=b 则a-b=0 返回0
2.何时使用自定义比较器?
只要sort默认的排序规则不是我们想要的,就要将自定义比较器函数传入到sort中,代替默认规则
3.为什么sort(NumAscSort)中的NumAscSort不加括号呢?
因为如果是sort(NumAscSort); 我们传入sort中的是一个回调函数,将一个函数作为参数传入另一个函数中反复使用
如果是sort(NumAscSort()); 我们传入的仅仅是一个值
4.如果我们不想进行升序排序,想进行降序排序怎么办?
解决办法: 颠倒比较器的正负号
比如:function NumDescSort(a,b){return b-a;}
如果是数组中是一个多个对象的,根据对象的值进行排序该怎么办呢?
我们只需要拿出对象的 key 进行比较即可。
按字段排序:
//定义按字段排序的规则函数
function sortBy(name,sort){
console.log('name='+name+',sort='+sort);
return function(o, p){
var a, b;
if (typeof o === "object" && typeof p === "object" && o && p) {
a = parseInt(o[name]);
b = parseInt(p[name]);
if (a === b) {
return 0;
}
if(sort == 'asc'){
if (typeof a === typeof b) {
return a < b ? -1 : 1;
}
return typeof a < typeof b ? -1 : 1;
}else{
if (typeof a === typeof b) {
return a > b ? -1 : 1;
}
return typeof a > typeof b ? -1 : 1;
}
}
else {
throw ("error");
}
}
}
//定义要排序的对象
var employees=[]
employees[0]={name:"George", age:32, retiredate:"March 12, 2014"}
employees[1]={name:"Edward", age:17, retiredate:"June 2, 2023"}
employees[2]={name:"Christine", age:58, retiredate:"December 20, 2036"}
employees[3]={name:"Sarah", age:62, retiredate:"April 30, 2020"}
//进行按"age"元素排序 asc or desc
employees.sort(sortBy("age","asc"));
文章评论(0)