Javascript 数组排序详解


Posted in Javascript onOctober 22, 2014

如果你接触javascript有一段时间了,你肯定知道数组排序函数sort,sort是array原型中的一个方法,即array.prototype.sort(),sort(compareFunction),其中compareFunction是一个比较函数,下面我们看看来自Mozilla MDN 的一段描述:
If compareFunction is not supplied, elements are sorted by converting them to strings and comparing strings in lexicographic (“dictionary” or “telephone book,” not numerical) order. For example, “80″ comes before “9″ in lexicographic order, but in a numeric sort 9 comes before 80.

下面看些简单的例子:

// Output [1, 2, 3]

console.log([3, 2, 1].sort());
// Output ["a", "b", "c"]

console.log(["c", "b", "a"].sort());
// Output [1, 2, "a", "b"]

console.log(["b", 2, "a", 1].sort());

从上例可以看出,默认是按字典中字母的顺序来排序的。

幸运的是,sort接受一个自定义的比较函数,如下例:

function compareFunction(a, b) {

 if( a > b) {

  return -1;

 }else if(a < b) {

  return 1;

 }else {

  return 0;

 }

}

//Outputs ["zuojj", "Benjamin", "1"] 

console.log(["Benjamin", "1", "zuojj"].sort(compareFunction));

排序完我们又有个疑问,如何控制升序和降序呢?

function compareFunction(flag) {

 flag = flag ? flag : "asc";

 return function(a, b) {

  if( a > b) {

   return flag === "desc" ? -1 : 1;

  }else if(a < b) {

   return flag === "desc" ? 1 : -1;

  }else {

   return 0;

  }

 };

}

//Outputs ["1", "Benjamin", "zuojj"] 

console.log(["Benjamin", "1", "zuojj"].sort(compareFunction()));

//Outputs ["zuojj", "Benjamin", "1"] 

console.log(["Benjamin", "1", "zuojj"].sort(compareFunction("desc")));

comparFunction的排序规则是这样的:
1.If it returns a negative number, a will be sorted to a lower index in the array.
2.If it returns a positive number, a will be sorted to a higher index.
3.And if it returns 0 no sorting is necessary.

下面我们来看看摘自Mozilla MDN上的一段话:
The behavior of the sort method changed between JavaScript 1.1 and JavaScript 1.2.为了解释这段描述,我们来看个例子:

In JavaScript 1.1, on some platforms, the sort method does not work. This method works on all platforms for JavaScript 1.2.

In JavaScript 1.2, this method no longer converts undefined elements to null; instead it sorts them to the high end of the array.详情请戳这里。

var arr = [];

arr[0] = "Ant";

arr[5] = "Zebra";

//Outputs ["Ant", 5: "Zebra"] 

console.log(arr);

//Outputs 6

console.log(arr.length);

//Outputs "Ant*****Zebra"

console.log(arr.join("*"));

//排序

var sortArr = arr.sort();

//Outputs ["Ant", "Zebra"] 

console.log(sortArr);

//Outputs 6

console.log(sortArr.length);

//Outputs "Ant*Zebra****"

console.log(sortArr.join("*"));

希望本文对你学习和了解sort()方法有帮助,文中不妥之处还望批评斧正。

参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Javascript 相关文章推荐
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
Apr 26 Javascript
js从Cookies里面取值的简单实现
Jun 30 Javascript
Jquery树插件zTree用法入门教程
Feb 17 Javascript
jQuery插件bxSlider实现响应式焦点图
Apr 12 Javascript
详解AngularJS中自定义过滤器
Dec 28 Javascript
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
JS库之Three.js 简易入门教程(详解之一)
Sep 13 Javascript
微信小程序实现带缩略图轮播效果
Nov 04 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
Apr 02 Javascript
Vue Router history模式的配置方法及其原理
May 30 Javascript
ES6的异步终极解决方案分享
Jul 11 Javascript
d3.js 地铁轨道交通项目实战
Nov 27 Javascript
Javascript中arguments对象详解
Oct 22 #Javascript
Javascript中的默认参数详解
Oct 22 #Javascript
js style动态设置table高度
Oct 21 #Javascript
js读写json文件实例代码
Oct 21 #Javascript
一个JavaScript防止表单重复提交的实例
Oct 21 #Javascript
javascript Deferred和递归次数限制实例
Oct 21 #Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
Oct 21 #Javascript
You might like
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
优化php效率,提高php性能的一些方法
2011/03/24 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
JS 数字转换研究总结
2013/12/26 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
使用python-pptx包批量修改ppt格式的实现
2020/02/14 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
制药工程专业职业生涯规划范文
2014/03/10 职场文书
优秀团员事迹材料
2014/12/25 职场文书
本科毕业论文指导教师评语
2014/12/30 职场文书
预备党员自我评价范文
2015/03/04 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书