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 相关文章推荐
jQuery中jqGrid分页实现代码
Nov 04 Javascript
基于JQuery的多标签实现代码
Sep 19 Javascript
javascript检测是否联网的实现代码
Sep 28 Javascript
kindeditor修复会替换script内容的问题
Apr 03 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
Jun 14 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
May 05 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
Oct 13 Javascript
Bootstrap源码解读排版(1)
Dec 23 Javascript
Node.js 回调函数实例详解
Jul 06 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
Aug 14 Javascript
JS返回顶部实例代码
Aug 09 Javascript
JS使用数组实现的队列功能示例
Mar 04 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下使用无限生命期Session的方法
2007/03/16 PHP
PHP 文件类型判断代码
2009/03/13 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
php中关于换行的实例写法
2019/09/26 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python动态网页批量爬取
2016/02/14 Python
python中执行shell的两种方法总结
2017/01/10 Python
python Celery定时任务的示例
2018/03/13 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
python读写csv文件的方法
2019/08/13 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
Keras实现DenseNet结构操作
2020/07/06 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
python pillow库的基础使用教程
2021/01/13 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
无财产无子女离婚协议书范文
2014/09/14 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
民主生活会主持词
2015/07/01 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python
python数字转对应中文的方法总结
2021/08/02 Python