前言

看JS红宝书的5.2.5章节关于sort()方法,如何用一个compare函数,让数组顺序,倒序,有点云里雾里的。在网上度娘了一下,发现更迷糊了。走投无路的情况下,只能发动神技能,去 stackoverflow 上碰碰运气,本人的英语一直是处于被他人嘲笑的水平,所幸 stackoverflow 上的大牛们解释得通俗易懂,就连我这种渣渣也是豁然开朗。

附上原链接,造福更多的小伙伴:

Algorithm of JavaScript “sort()” Function

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()的更多相关文章

  1. JavaScript中Array.prototype.sort()的详解

    摘抄来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort sor ...

  2. Array.prototype.sort()对数组对象排序的方法

    Array.prototype.sort()方法接受一个参数——Function,Function会提供两个参数,分别是两个进行比较的元素,如果元素是String类型则通过Unicode code进行 ...

  3. 我可能不懂Array.prototype.sort

    今天 fix 我们后台系统的一些 bug.系统是基于 beego 和模板开发的,各种前后端代码揉作一团,没有格式,没有 eslint,全局变量满天飞,连 js 代码都有后端的插值,读起来非常 酸爽. ...

  4. JavaScript,通过分析Array.prototype.push重新认识Array

    在阅读ECMAScript的文档的时候,有注意到它说,数组的push方法其实不仅限于在数组中使用,专门留作通用方法.难道是说,在一些类数组的地方也可以使用?而哪些是和数组非常相像的呢,大家或许一下子就 ...

  5. javascript 中Array.prototype.sort 函数的用法

    来源:http://www.jb51.net/article/5769.htm JavaScript中对变量的操作都是通过引用方式,而对数组也一样. 前两天想要对一个数组进行复制,一直苦于找不到办法( ...

  6. Array.prototype.sort()

    sort() 方法对数组的元素做原地的排序,并返回这个数组.默认按照字符串的Unicode码位点(code point)排序. 语法 arr.sort([compareFunction]) 参数 co ...

  7. JS - Array.prototype.sort(compare)

    function compare(a, b) { return -1; // a 在 b 前面 return 1; // a 在 b 后面 return 0; // 并列排序,保持在源数组中的先后顺序 ...

  8. javascript学习笔记之array.sort

    arrayName.sort()方法: 功能是实现排序(按ascii编码或按数字大小),可无参或有参使用,无参时默认升序排列.有参时可实现升序或降序排列,参数必须是具有返回值的方法,当方法表达式大于0 ...

  9. Javascript语言精粹之Array常用方法分析

    Javascript语言精粹之Array常用方法分析 1.Array常用方法分析 1.1 Array.prototype.sort() Javascript的默认比较函数假定被排序元素都是字符串,所以 ...

随机推荐

  1. python , angular js 学习记录【3】

    1.Alembic是SQLAlchemy作者编写的Python数据库迁移工具.用它实现模型类和数据库的同步更新.(安装以及操作步骤 使用Alembic迁移数据库) 使用Alembic添加数据库字段操作 ...

  2. linux之netstat命令

    netstat用于显示各种网络相关的信息,如网络连接,路由表接口状态(interface statistics), masquerade连接,多播成员(Multicast Memberships)等等 ...

  3. [MySQL] 分页优化

    在传统的分页思路影响下,很多人都形成了对于分页的固定理解,也就是给出select语句,先用count()函数计算出总的条目,除与每个页面大小pagesize,然后用ceil取整,得出总的页数,用lim ...

  4. CentOS 7合盖后黑屏但不进入睡眠模式修改

    CentOS 7合盖后黑屏但不进入睡眠模式修改 systemd 能够处理某些电源相关的 ACPI事件,你可以通过从 /etc/systemd/logind.conf 以下选项进行配置: HandleP ...

  5. 【mongo】mongoVUE使用

    1.查询存在字段"test"的项 {"test":{$exists:true}} 2.在表中插入字段 {$set:{"}} 3.正则匹配 {" ...

  6. PE读写

    // 仿PE文件.cpp : Defines the entry point for the console application.// #include "stdafx.h"# ...

  7. C+继承

    // 继承.cpp : Defines the entry point for the console application.// #include "stdafx.h" str ...

  8. myeclipse实现包的分层显示

  9. 【转】理解inode

    From:http://www.ruanyifeng.com/blog/2011/12/inode.html  阮一峰大神真NB 作者: 阮一峰 日期: 2011年12月 4日 inode是一个重要概 ...

  10. 控制window.print不打印某些内容

    <style type="text/css" media="print"> .noprint { display:none;} </style ...