前言

看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装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  2. 变量声明---let,const,解构

    let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题. const是对let的一个增强,它能阻止对一个变量再次赋值. 块作用域 当用let声明一个变量,它使用的是 ...

  3. DevExpress 关于alertControl 图片显示

    private void button1_Click(object sender, EventArgs e) { AlertInfo info = new AlertInfo("Captio ...

  4. [MySQL]MySQL之权限管理

    一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界.比如只允许你执行select操作,那么你就不能执行update操作.只允许你从某台机器上连接m ...

  5. [Sass]局部变量和全局变量

    [Sass]局部变量和全局变量 Sass 中变量的作用域在过去几年已经发生了一些改变.直到最近,规则集和其他范围内声明变量的作用域才默认为本地.如果已经存在同名的全局变量,从 3.4 版本开始,Sas ...

  6. 【WEB】web www http html hypermedia hypertext 技术名词的意思

    www WWW是环球信息网的缩写,(亦作"Web"."WWW"."'W3'",英文全称为"World Wide Web" ...

  7. 高德地图纯js和html

    <!doctype html> <html> <head> <meta content="" charset="utf-8&qu ...

  8. 安卓真机调试 出现Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE....

    [2016-08-20 14:38:39 - hybrid-android] Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE[2016-0 ...

  9. python中的collections

    python中有大量的内置模块,很多是属于特定开发的功能性模块,但collections是属于对基础数据的类型的补充模块,因此,在日常代码中使用频率更高一些,值得做个笔记,本文只做主要关键字介绍,详细 ...

  10. Python学习笔记(3)

      1.元组 元组的定义符号是() ,元素定义与列表完全一致.不同的是元组的内容是不可变的. 2.字典 字典里面的内容是无序的. 字典的元素组成形式是 key:value key的定义规则:key是不 ...