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

我耐着性子看了半天,陆陆续续改了几个 bug,顺便整理一下代码,总算完成的差不多了。只剩下最后一个小问题,乐观估计可以十分钟内搞定。想到这里,我不禁激动地哼起了小曲儿,马上要从酸爽的代码中抽身了。然而,十分钟过去了,半个小时过去了。。

这事还真没那么简单,事情要从我自以为‘熟悉’的 Array.prototype.sort 这个方法说起。

根据 MDN 的文档,这个方法接收一个可选的 compareFunction。而这个 compareFunction 接收两个数组元素,并返回一个值决定这两个元素是否需要调换位置,规则如下:

如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;

如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);

如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。

compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

知道这个规则之后,我们就可以愉快的对数组按自己规则来进行排序了,普通的升序或者降序自然没的说,然而我面对的是这么一个自定义规则:

有一个数组,由一位数,两位数和 3 位数构成;现在需要排序后的数组按整体从小到大排列,但是两位数的元素要放到最后。举个例子:

function compare(a,b){
// TODO
} let arr = [1, 8, 3, 11, 100, 15, 201] arr.sort(compare) arr //[1, 3, 8, 100, 201, 11, 15]

到了这里,大家可以先尝试写一下这个 compare 函数;如果能成功输出正确的结果,那么这篇文章对你也就没什么用了。在说答案之前,先说一个我之前理解存在的误区:

compare 函数接收到的两个元素在数组中的位置是不是一定 a 在前面,b 在后面?其实不是。在 compare 函数中打印出 a 和 b 就可以发现这一点。

自定义排序

知道 a 和 b 是无序的之后,我们就可以尝试写一下这个比较函数了,传入的元素可以分为以下 3 种情况:

  1. a,b 都是两位数时,按从小到大排序
  2. a,b 中有一个两位数,两位数放到后边
  3. a,b 都不是两位数,按从小到大排序

所以,代码如下:

function isdoubleDigit(num){ return num >= 10 && num <= 99 }
function compare(a, b){
// 都是两位数
if(isdoubleDigit(a) && isdoubleDigit(b)) {
return a - b
} // a是两位数,b不是,a应该被放到最后
if(isdoubleDigit(a) && !isdoubleDigit(b)) {
return 1
} // b是两位数,a不是,b应该被放到最后
if(!isdoubleDigit(a) && isdoubleDigit(b)) {
return -1
}
// 都不是两位数,正常排序
return a - b
}

这里说一下我原先理解中的第二个误区,那就是以为, compareFunction是用来交换a,b元素在数组中的位置的,像冒泡排序那样。其实这种看法是错误的,看下面的截图可以看出,compareFunction只是在决定排序后的数组中a,b的相对顺序,而不是对a,b的位置直接进行交换。

如MDN中所说,sort方法是用原地算法实现的,有兴趣的朋友可以去研究一下,本文完。

我可能不懂Array.prototype.sort的更多相关文章

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

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

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

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

  3. Array.prototype.sort()

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

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

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

  5. JavaScript解惑记之Array.prototype.sort()

    前言 看JS红宝书的5.2.5章节关于sort()方法,如何用一个compare函数,让数组顺序,倒序,有点云里雾里的.在网上度娘了一下,发现更迷糊了.走投无路的情况下,只能发动神技能,去 stack ...

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

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

  7. 数组方法 Array.prototype

    Object.prototype 数组的值是有序的集合,每一个值叫做元素,每一个元素在数组中都有数字位置编号,也就是索引,js中数组是弱类型的,数组中可以含有不同类型的元素.数组元素甚至可以是对象或者 ...

  8. Array.prototype

    Array.prototype  属性表示 Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法. /* 如果JavaScript本身不提供 first() 方法, 添加一个返回 ...

  9. (转)Array.prototype.slice.call自解

    很多框架或者库里面都会有这句的使用,最多的还是通过Array.prototype.slice.call(arguments,0)把arguments这个伪数组转换为真正的数组.但为什么可以这么做,却一 ...

随机推荐

  1. form表单内容JSON格式转化

    form表单提交时,对于Content-type为application/json是提交时需要转换成json格式,据说form enctype=‘application/json’这样就可以,然而在我 ...

  2. 获取父窗口的xxx节点的方法

    window.parent.document.getElementById("xxx");获取父窗口的xxx节点$("#myEle", window.paren ...

  3. Codeforces Round #555 (Div. 3) E. Minimum Array

    题意:b数组可以自由排序,c[i]=(a[i]+b[i])%n. 题目中要求c数组的字典序是最小的.那么我们需要尽量满足前面的c[i],才能使字典序最小. 我们知道a[i]和b[i]都是[0,n-1] ...

  4. linux修改用户id,组id

    一.修改用户uid usermod -u foo 二.修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三.检查 cat /etc/passwd su ...

  5. java环境下载

    https://repo.huaweicloud.com/java/jdk/8u201-b09/

  6. servlet从mysql中取数据时出现的汉字编码问题

    取出的汉字都是问号 之后根据网友提示在输出之前对response进行编码设置 正常显示

  7. XML生成XAMl扩展

    所有的WPF控件列为枚举 代码如: 1 public enum ControlType 2 { 3 Window_Resources, 4 Page_Resources, 5 Grid, 6 Stac ...

  8. SQL Server 存储过程的运用

    概述 最近因为业务的需求写了一段时间存储过程,发现之前写的存储过程存在一些不严谨的地方,特别是TRY...CATCH中嵌套事务的写法:虽然之前写的并没有错,但是还是埋藏着很大的隐患在里面.希望这篇文章 ...

  9. Nerd的套现ATM机

    Nerd是一群似乎只在学生阶段才出尽风头的人.不善言辞,闷头学习,每遇考试便战功赫赫风光无限,赢得天下名.这样的描述,对那些成绩一般.喜欢天马行空.甚至有些多动症倾向的人来讲,无异于是噩梦.幸好有社会 ...

  10. 从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.引言 HTTP 协议是最重要的互联网基础协议之一,它从最初的仅为浏览网页的目的进化到现在,已经是短连接通信的事实工业标准,最新版本 HT ...