Js数组排序函数sort()引见

原文:Js数组排序函数sort()引见

JavaScript完成多维数组、对象数组排序,其有用的就是原生的sort()要领,用于对数组的元素举行排序。
sort() 要领用于对数组的元素举行排序。语法以下:
arrayObject.sort(sortby)
返回值为对数组的援用。请注意,数组在原数组上举行排序,不天生副本。
假如挪用该要领时没有运用参数,将按字母递次对数组中的元素举行排序,说得更准确点,是根据字符编码的递次举行排序。要完成这一点,起首应把数组的元素都转换成字符串(若有必要),以便举行比较。
假如想根据其他规范举行排序,就需要供应比较函数,该函数要比较两个值,然后返回一个用于申明这两个值的相对递次的数字。比较函数应当具有两个参数 a 和 b,其返回值以下:
若 a 小于 b,在排序后的数组中 a 应当出如今 b 之前,则返回一个小于 0 的值。
若 a 即是 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。

function NumAscSort(a,b)
{
 return a - b;
}
function NumDescSort(a,b)
{
 return b - a;
}
var arr = new Array( 3600, 5010, 10100, 801); 
arr.sort(NumDescSort);
alert(arr);
arr.sort(NumAscSort);
alert(arr);

sort(fun)接收了个排序划定规矩函数,这个函数将比较2个数字的大小。而我们的对象数组排序,实际上道理也是一样的。
假如不比较数字的大小,则能够如许:

var myarray=["Apple", "Banana", "Orange"]
myarray.sort()

数组直接挪用sort()后,数组按字母递次对数组中的元素举行排序,说得更准确点,是根据字符编码的递次举行排序。
关于对象数组排序,我们先写一个组织比较函数的函数:

//by函数接收一个成员名字符串做为参数
//并返回一个能够用来对包括该成员的对象数组举行排序的比较函数
var by = function(name){
 return function(o, p){
   var a, b;
   if (typeof o === "object" && typeof p === "object" && o && p) {
     a = o[name];
     b = p[name];
     if (a === b) {
       return 0;
     }
     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"}

直接挪用函数:

employees.sort(by("age"));

到这里,对象数组排序就算基础完成了。那怎样完成多个键值排序呢?意义就是先是对age排序,假如age雷同,再比较name。
这时刻,我们能够进一步修正by函数,让其能够接收第二个参数,当重要的键值发生一个婚配的时刻,另一个compare要领将被挪用以决出高低。

//by函数接收一个成员名字符串和一个可选的次要比较函数做为参数
//并返回一个能够用来包括该成员的对象数组举行排序的比较函数
//当o[age] 和 p[age] 相称时,次要比较函数被用来决出高低
var by = function(name,minor){
 return function(o,p){
   var a,b;
   if(o && p && typeof o === 'object' && typeof p ==='object'){
     a = o[name];
     b = p[name];
     if(a === b){
       return typeof minor === 'function' ? minor(o,p):0;
     }
     if(typeof a === typeof b){
       return a < b ? -1:1;
     }
     return typeof a < typeof b ? -1 : 1;
   }else{
     thro("error");
   }
 }
}
 
employees.sort(by('age',by('name')));

好了,如今能够放心运用了。假如看不懂,可直接copy 这个by函数到你的运用内里,直接挪用即可。

    原文作者:whhlu
    原文地址: https://segmentfault.com/a/1190000008859924
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞