php怎么按字段倒叙排列,js 正序排序、倒序排序、按字段名称排序方法

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

如果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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值