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 相关文章推荐
JavaScript 中的replace方法说明
Apr 13 Javascript
基于jquery的loading 加载提示效果实现代码
Sep 01 Javascript
JavaScript prototype属性深入介绍
Nov 27 Javascript
jQuery中delegate与on的用法与区别示例介绍
Dec 20 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
Dec 18 Javascript
JQuery 设置checkbox值二次无效的解决方法
Jul 22 Javascript
jQuery中DOM节点的删除方法总结(超全面)
Jan 22 Javascript
jQuery事件详解
Feb 23 Javascript
JavaScript hasOwnProperty() 函数实例详解
Aug 04 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
Apr 28 Javascript
JS模拟实现哈希表及应用详解
May 04 Javascript
vue created钩子函数与mounted钩子函数的用法区别
Nov 05 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 at(@)符号的用法简介
2009/07/11 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
Javascript 自定义类型方法小结
2010/03/02 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
2015/08/13 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
python list语法学习(带例子)
2013/11/01 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
python 元组和列表的区别
2020/12/30 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
岳庙导游词
2015/02/04 职场文书
高中生军训感言
2015/08/01 职场文书
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL