js 正序排序、倒序排序、按字段名称排序方法

2019 年 1 月 24 日 0 条评论 8.74k 次阅读 0 人点赞

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)

(Spamcheck Enabled)