前言

看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. Volley框架使用笔记

    1.初始化请求队列 RequestQueue RequestQueue queue= Volley.newRequestQueue(context); 2.StringRequest 网络请求 Get ...

  2. PHP 数据库连接工具类(MySQLI函数包装)

    ====================mysql===================== <?php class mysql { private $mysqli; private $resu ...

  3. Python全栈【异常处理】

    Python全栈[异常处理] 本节内容: 1.异常处理 2.什么时候用异常处理 异常处理 1.异常处理: 异常就是程序运行时发生错误的信号,异常处理是在编程过程中为了增加友好性,在程序出现bug时一般 ...

  4. iOS版本更新在APP中直接访问AppStore

    1.导入框架 #import <StoreKit/StoreKit.h> 2.添加代理 <SKStoreProductViewControllerDelegate> 3.设置跳 ...

  5. php_zip 类

    <?php /** * Created by PhpStorm. * User: StarZhan * Date: 2016/5/24 * Time: 12:04 */class PHPZip{ ...

  6. Eclipse 增加php插件

    Eclipse 下载解压后运行, Help ------> Install New Software,在 Work whit 输入http://download.eclipse.org/tool ...

  7. WEB 用户指南 -- WEB 系统结构文档

    本文描述了如何使用 WEB语言 编程.同时还包含了 WEAVE 和 TANGLE 程序的说明文档. WEB 程序 可以读取 WEB 文件,然后输出 TeX 文档 和 Pascal 程序. 使用 WEB ...

  8. Erlang--etc结构解析

    Erlang中可以用List表达集合数据,但是如果数据量特别大的话在List中访问元素就会变慢了;这种主要是由于List的绝大部分操作都是基于遍历完成的. Erlang的设计目标是软实时(参考:htt ...

  9. C#获取屏幕鼠标所指点的颜色

    有时候要获取屏幕某一点的坐标颜色值,可以如下实现: 在VS2012中创建一个C#的Windows窗口应用程序,然后在Form上添加PictureBox和Button两个控件,并加入以下代码. //需要 ...

  10. 大数据系列-java用官方JDBC连接greenplum数据库

    这个其实非常简单,之所以要写此文是因为当前网上搜索到的文章都是使用PostgreSQL的驱动,没有找到使用greenplum官方驱动的案例,两者有什么区别呢? 一开始我也使用的是PostgreSQL的 ...