Js数组排序函数sort()介绍


Posted in Javascript onJune 08, 2015

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函数到你的应用里面,直接调用即可。

Javascript 相关文章推荐
chrome下img加载对height()的影响示例探讨
May 26 Javascript
jQuery事件绑定与解除绑定实现方法
Apr 15 Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 Javascript
jQuery版AJAX简易封装代码
Sep 14 Javascript
详解webpack + react + react-router 如何实现懒加载
Nov 20 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 Javascript
微信运维交互机器人的示例代码
Nov 12 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
Nov 28 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 Javascript
如何在微信小程序中存setStorage
Dec 13 Javascript
js实现飞机大战游戏
Aug 26 Javascript
详解TypeScript中的类型保护
Apr 29 Javascript
元素绑定click点击事件方法
Jun 08 #Javascript
JavaScript获取URL汇总
Jun 08 #Javascript
详解JavaScript中的forEach()方法的使用
Jun 08 #Javascript
详解JavaScript中的every()方法
Jun 08 #Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
Jun 08 #Javascript
javaScript中with函数用法实例分析
Jun 08 #Javascript
简介JavaScript中的sub()方法的使用
Jun 08 #Javascript
You might like
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
python中pycurl库的用法实例
2014/09/30 Python
使用python实现tcp自动重连
2017/07/02 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
关于python3中setup.py小概念解析
2019/08/22 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
设计毕业生简历中的自我评价
2013/10/01 职场文书
人力资源经理自我评价
2014/01/04 职场文书
简历上的自我评价
2014/02/03 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
出国留学担保书
2014/05/20 职场文书
教师业务学习材料
2014/12/16 职场文书
小班上学期个人总结
2015/02/12 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server