JavaScript解惑记之Array.prototype.sort()
前言
看JS红宝书的5.2.5章节关于sort()
方法,如何用一个compare函数,让数组顺序,倒序,有点云里雾里的。在网上度娘了一下,发现更迷糊了。走投无路的情况下,只能发动神技能,去 stackoverflow
上碰碰运气,本人的英语一直是处于被他人嘲笑的水平,所幸 stackoverflow
上的大牛们解释得通俗易懂,就连我这种渣渣也是豁然开朗。
附上原链接,造福更多的小伙伴:
sort()的排序机制
首先,从一个案例讲起,假设我有一个数组:
var nums = [10, 5, 40, 25, 100, 1];
然后将其排序:
console.log(nums.sort());
//得出的结果:[1, 10, 100, 25, 40, 5]
只是单纯的用 sort()
方法排序,得出的结果和我们想象的有点出入,这是因为 sort()
会把我们数组里面的数字全部转化成字符串。也就是说,在排序的时候,所排序的数组其实是:
var nums = ["10", "5", "40", "25", "100", "1"];
如果我们把数字字符串用字母来替换,会怎样呢?
//0=>a
//1=>b
//2=>c
//4=>d
//5=>e
//转换前的数组
var nums = ["ba" ,"e" , "da" ,"ce" ,"baa","b"];
//得出的结果数组
// [1, 10, 100, 25, 40, 5]
// 将结果数组的数字转换成字符串,得到:
["b", "ba", "baa", "ce", "da","e"]
看到这里,感觉豁然开朗了,这不就是字典序排序嘛。
排序数字的方法
了解了 sort()
方法的排序机制,但是在实际开发中,我们一般不用这种类型的排序顺序,而红宝书中所谓的compare函数又是怎样一种存在呢?
function sortAsc(current, next){
return current - next;
}
function sortDesc(current, next){
return next - current;
}
sort()
方法接受一个比较函数,元素两两比较,当返回的结果是0
或者负数
时,元素的位置不变,当返回的结果为正数时,前后两个元素交换位置。
//剖析执行过程
console.log(nums.sort(sortAsc)); //[1, 5, 10, 25, 40, 100]
//原数组:[10, 5, 40, 25, 100, 1];
//1:[5, 10, 25, 40, 1, 100];
//2:[5, 10, 25, 1, 40, 100];
//3:[5, 10, 1, 25, 40, 100];
//4:[5, 1, 10, 25, 40, 100];
//5:[1, 5, 10, 25, 40, 100];
//==================================================//
console.log(nums.sort(sortDesc)); //[100, 40, 25, 10, 5, 1]
//原数组:[10, 5, 40, 25, 100, 1];
//1:[10,40 ,25, 100, 5, 1];
//2:[40, 25, 100, 10, 5, 1];
//3:[40, 100, 25, 10, 5, 1];
//4:[100, 40, 25, 10, 5, 1];
排序扩展
照这个两两比较,正数交换位置,负数及0元素位置不变的“哲学”,我们可以写出不同数据类型的不同排序方法:
数组排序
order (1, 2, 3...):
function(a, b){
return a - b;
}
order (9, 8, 7...):
function(a, b){
return b - a;
}
排序字符串
order (A, B, C...):
function(a, b){
return a > b? 1: -1;
}
order (Z, Y, X...):
function(a, b){
return b > a? 1: -1;
}
通过对象属性来排序
sort by key:
function(a, b){
return a.key - b.key;
}
JavaScript解惑记之Array.prototype.sort()的更多相关文章
- JavaScript中Array.prototype.sort()的详解
摘抄来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort sor ...
- Array.prototype.sort()对数组对象排序的方法
Array.prototype.sort()方法接受一个参数——Function,Function会提供两个参数,分别是两个进行比较的元素,如果元素是String类型则通过Unicode code进行 ...
- 我可能不懂Array.prototype.sort
今天 fix 我们后台系统的一些 bug.系统是基于 beego 和模板开发的,各种前后端代码揉作一团,没有格式,没有 eslint,全局变量满天飞,连 js 代码都有后端的插值,读起来非常 酸爽. ...
- JavaScript,通过分析Array.prototype.push重新认识Array
在阅读ECMAScript的文档的时候,有注意到它说,数组的push方法其实不仅限于在数组中使用,专门留作通用方法.难道是说,在一些类数组的地方也可以使用?而哪些是和数组非常相像的呢,大家或许一下子就 ...
- javascript 中Array.prototype.sort 函数的用法
来源:http://www.jb51.net/article/5769.htm JavaScript中对变量的操作都是通过引用方式,而对数组也一样. 前两天想要对一个数组进行复制,一直苦于找不到办法( ...
- Array.prototype.sort()
sort() 方法对数组的元素做原地的排序,并返回这个数组.默认按照字符串的Unicode码位点(code point)排序. 语法 arr.sort([compareFunction]) 参数 co ...
- JS - Array.prototype.sort(compare)
function compare(a, b) { return -1; // a 在 b 前面 return 1; // a 在 b 后面 return 0; // 并列排序,保持在源数组中的先后顺序 ...
- javascript学习笔记之array.sort
arrayName.sort()方法: 功能是实现排序(按ascii编码或按数字大小),可无参或有参使用,无参时默认升序排列.有参时可实现升序或降序排列,参数必须是具有返回值的方法,当方法表达式大于0 ...
- Javascript语言精粹之Array常用方法分析
Javascript语言精粹之Array常用方法分析 1.Array常用方法分析 1.1 Array.prototype.sort() Javascript的默认比较函数假定被排序元素都是字符串,所以 ...
随机推荐
- instanceof运算符
instanceof运算符:判断该对象是否是某一个类的实例. 语法格式:boolean b = 对象A instanceof 类B://判断A对象是否是B类的实例,如果是返回true. 若对象是类的实 ...
- maven实战(04)_在pom中使用properties
使用常量不仅让代码变得简洁,更重要的是可以避免重复,在需要更改的时候,只需要修改一处,降低了错误发生的概率. <project> <modelVersion>4.0.0< ...
- 操作系统课程设计--Linux平台哲学家问题
哲学家问题是操作系统中资源分配的经典问题 linux平台下的系统api不同于Windows下的实现 要求:一个正确的哲学家程序(不会发生死锁) 一个错误的哲学家程序(会发生死锁) 系统环境:Eleme ...
- Python全栈【异常处理】
Python全栈[异常处理] 本节内容: 1.异常处理 2.什么时候用异常处理 异常处理 1.异常处理: 异常就是程序运行时发生错误的信号,异常处理是在编程过程中为了增加友好性,在程序出现bug时一般 ...
- 移植一个cocos2d-x游戏
1.编译的时候,如果遇到如下的提示信息: No rule to make target `jni/./../Classes/KeyBoardInput.cpp', needed by `obj/loc ...
- How to Fix GNOME License Not Accepted Issue on CentOS 7
This post assume that you have just finished the Gnome GUI installation on CentOS 7 by using “yum gr ...
- Spring mvc时间格式处理
spring mvc中,如果时间格式是yyyy-MM-dd,传入后台会报错,要增加一些配置才可以. 1.修改spring-mvc.xml,增加org.springframework.format.su ...
- 在win7环境下批量修改文件权限
在附件->命令提示符->右键->以管理员身份运行 进入你需要修改的文件位置,然后输入下面两条命令 takeown /f * /A /R icacls * /t /grant:r ev ...
- linux部署pxe+kickstart批量安装linux操作系统
环境 系统 centos6.6 无图形界面 ip 192.168.2.1 系统 centos7.2 有图形界面 以下命令在centos6.6上执行 1. yum -y install dhcp* tf ...
- lnmp安装
一.准备工作 需要的安装包都是从官网下载的,系统centos6.6 nginx-1.10.1.tar.gz php-5.6.24.tar.gz mysql-5.5.32.tar.gz 所有的包都一传入 ...