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 相关文章推荐
动态的改变IFrame的高度实现IFrame自动伸展适应高度
Dec 28 Javascript
jquery调取json数据实现省市级联的方法
Jan 29 Javascript
初步了解javascript面向对象
Nov 09 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
Feb 10 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 Javascript
详解webpack 如何集成第三方js库
Jun 29 Javascript
vue自定义全局组件(自定义插件)的用法
Jan 30 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
cocos2dx+lua实现橡皮擦功能
Dec 20 Javascript
Vue中的验证登录状态的实现方法
Mar 09 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 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
写一个用户在线显示的程序
2006/10/09 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
js获取字符串字节数方法小结
2015/06/09 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
python中定义结构体的方法
2013/03/04 Python
Python中的is和id用法分析
2015/01/26 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
python 实现A*算法的示例代码
2018/08/13 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
python字符串查找函数的用法详解
2019/07/08 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
劲霸男装广告词
2014/03/21 职场文书
活动总结怎么写啊
2014/05/07 职场文书
货款欠条范本
2015/07/03 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
Python Numpy库的超详细教程
2022/04/06 Python