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函数到你的运用内里,直接挪用即可。