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中的原型链prototype介绍
Dec 30 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
Jul 18 Javascript
javascript html5实现表单验证
Mar 01 Javascript
在Node.js中使用Javascript Generators详解
May 05 Javascript
第十篇BootStrap轮播插件使用详解
Jun 21 Javascript
jQuery 更改checkbox的状态,无效的解决方法
Jul 22 Javascript
Bootstrap 填充Json数据的实例代码
Jan 11 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 Javascript
VUE 使用中踩过的坑
Feb 08 Javascript
vue.js 实现点击展开收起动画效果
Jul 07 Javascript
laydate如何根据开始时间或者结束时间限制范围
Nov 15 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
Jul 30 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的MySQL连接类
2013/06/07 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
PHP单链表的实现代码
2016/07/05 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
JavaScript中的事件处理
2008/01/16 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python中map、any、all函数用法分析
2015/04/21 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
详解python3百度指数抓取实例
2016/12/12 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
python 中字典嵌套列表的方法
2018/07/03 Python
Django web框架使用url path name详解
2019/04/29 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
管理科学大学生求职信
2013/11/13 职场文书
大学生求职信范文应怎么写
2014/01/01 职场文书
法律专业自荐信
2014/06/03 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
立案决定书范文
2015/06/24 职场文书
2016年三八红旗手先进事迹材料
2016/02/26 职场文书