在日常的代码开发中,关于数组排序的操作可不少,JavaScript 中可以调用 sort 方法对数组进行快速排序。

今天,就数组的 sort 方法来学习一下,避免日后踩坑的悲惨遭遇。

概念

sort 方法用于对数组的元素进行排序。

语法

arr.sort([compareFunction])

参数解析

compareFunction (可选)

用来指定按某种顺序进行排列的函数。该函数有两个参数:

  • firstEl 第一个比较的元素
  • secondEl 第二个比较的元素

该函数如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。

返回值

排序后的数组。

请注意,数组已原地排序,并且不进行复制。

犹记得当年第一次使用数组排序的场景:查到有个 sort 方法后,赶紧用起来, 结果……,如下:

const arr = [49, 5, 14, 89, 71, 3, 10];
arr.sort();
// 输出 [10, 14, 3, 49, 5, 71, 89]

看到结果的瞬间,整个人有点方了。

这就有点不讲武德了,说好的排序呢?再三确认我的机器没毛病后,赶紧查文档,看看文档怎么说:

如果没有指明 compareFunction ,那么元素会按照转换为的字符串的逐个字符的Unicode位点进行排序。

这么一解释的话,上面数组的排序可以作一下理解:

  1. 首先,将数组里的数字逐个转换为字符串,得到 ['49', '5', '14', '89', '71', '3', '10']

  2. 再按照首位的字符的 Unicode 位点来算的话:

    • 1 的编码在 3 之前,所以 10 和 14 排在了 3 之前

    • 3 的编码在 4 之前,所以 49 排在了 3 的后面

      ……

    如果首位字符的编码相同,则比较第二位字符的编码,比如 10 排在了 14之前(0 和 4 的比较结果)

道理貌似是通了,但是这不是我想要的结果,看来还是得靠比较函数 compareFunction ,我们来看看这个 compareFunction 到底是何方神圣。

用法

基本用例如下:

const arr = [49, 5, 14, 89, 71, 3, 10];

// 一般写法
arr.sort(function (a, b) {
return a - b; // 按照升序排列
}); // 箭头函数
arr.sort((a, b) => a - b); // 结果 [3, 5, 10, 14, 49, 71, 89]

以上是按照升序排列的写法,如果要按照降序排列,只需把比较函数中的 return a - b; 改为 return b - a;

对象数组排序

sort() 方法除了可以用于数字数组和字符数组的排序外,还可用于对象数组的排序:

var items = [
{name: 'Edward', value: 21},
{name: 'Sharpe', value: 37},
{name: 'And', value: 45},
{name: 'The', value: -12},
{name: 'Magnetic'},
{name: 'Zeros', value: 37}
]; // sort by value
items.sort(function (a, b) {
return (a.value - b.value)
}); // sort by name
items.sort(function (a, b) {
var nameA = a.name.toUpperCase(); // ignore upper and lowercase
var nameB = b.name.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
} // names must be equal
return 0;
});

对非 ASCII 字符排序

当排序非 ASCII 字符的字符串(如包含类似 e, é, è, a, ä 等字符的字符串)。一些非英语语言的字符串需要使用 String.localeCompare。这个函数可以将函数排序到正确的顺序。

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
return a.localeCompare(b);
}); // items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']

使用映射改善排序

compareFunction 可能需要对元素做多次映射以实现排序,尤其当 compareFunction 较为复杂,且元素较多的时候,某些 compareFunction 可能会导致很高的负载。使用 map 辅助排序将会是一个好主意。基本思想是首先将数组中的每个元素比较的实际值取出来,排序后再将数组恢复。

// 需要被排序的数组
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo']; // 对需要排序的数字和位置的临时存储
var mapped = list.map(function(el, i) {
return { index: i, value: el.toLowerCase() };
}) // 按照多个值排序数组
mapped.sort(function(a, b) {
return +(a.value > b.value) || +(a.value === b.value) - 1;
}); // 根据索引得到排序的结果
var result = mapped.map(function(el){
return list[el.index];
});

本文完,感谢阅读!

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好!我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

~

JavaScript 中数组 sort() 方法的基本使用的更多相关文章

  1. JavaScript中数组Array方法详解

    ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...

  2. 前端面试之JavaScript中数组的方法!【残缺版!!】

    前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...

  3. javascript中数组的方法

    数组的方法 1.concat():连接两个或多个数组 2.indexOf(arg): ​ 查找数组中的arg元素,如果没有,则返回-1,如果有,则返回该元素的最小下标 ​ lastIndexOf(ar ...

  4. javascript中数组的方法你真的都了解吗?

    本篇文章主要讲述ES5中的数组,包括数组两种创建方式,属性,以及 9 大类 ,总共23个操作方法,非常全面,看完之后ES5数组这一部分基本都了解了,下一篇文章,我会讲述ES6中对数组的加成,新增了哪些 ...

  5. 你真的会用JavaScript中的sort方法吗

      在平时的业务开发中,数组(Array) 是我们经常用到的数据类型,那么对数组的排序也很常见,除去使用循环遍历数组的方法来排列数据,使用JS数组中原生的方法 sort 来排列(没错,比较崇尚JS原生 ...

  6. javascript中的sort()方法

    现在在学习javascript中,发现sort()函数是有点奇怪的东西(可能是本人水平的问题-_-!),于是就在这里记录一下自己找到的东西吧.sort()这个方法的参数很奇怪,必须是函数,但也是可选参 ...

  7. JavaScript中数组map()方法

    JavaScript 数组map()方法创建一个新的数组使用调用此数组中的每个元素上所提供的函数的结果.语法 ? 1 array.map(callback[, thisObject]); 下面是参数的 ...

  8. javascript 中根据sort 方法随机数组 (Math.random)

    var arr = [1,2,3,4,5,6,7,8,9,10]; function Arandom(a,b){ return (Math.random() > 0.5) ? 1 : -1;; ...

  9. JavaScript中数组的方法总结

    js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^var arr = new Array();arr[0] = "aaa";arr[1] ...

随机推荐

  1. NNLM原理及Pytorch实现

    NNLM NNLM:Neural Network Language Model,神经网络语言模型.源自Bengio等人于2001年发表在NIPS上的<A Neural Probabilistic ...

  2. 文件上传bypass安全狗

    0x00 前言 本文首发于先知社区:https://xz.aliyun.com/t/9507 我们知道WAF分为软WAF,如某狗,某盾等等:云WAF,如阿里云CDN,百度云CDN等等:硬WAF,如天融 ...

  3. 记一次“愉快”的lnmp环境的搭建

    愉快的lnmp环境搭建 后续更新 几个笔记记录 yum remove php-mysql yum -y install cmake autoconf wget gcc-c++ gcc zlib pcr ...

  4. hdu3460 字典树(打印机)

    题意:        给你一些名字,让你用一台打印机去打印这些名字,打印机只有三个操作 (1)打印的都是小写字母 (2)每次可以在当前字母的后面加一位,或删除一位. (3)打印当前串 问你最少多少步可 ...

  5. hdu1501 记忆化搜索

    题意:       给你三个字符串,问你前两个能不能拼成第三个串. 思路:       直接记忆化神搜就行,思路水,看下代码就知道了.这个题目我感觉最大公共子序列dp的作法是错的,虽然有人ac了,随便 ...

  6. hdu 4891 模拟

    题意:       给你一个串,问你有几种意思,有两个规则 (1) { }  答案乘以  ({}之间"|"的个数 + 1)  (2)  &&   答案乘以  (&a ...

  7. JSONP跨域资源共享的安全问题

    目录 关于 JSONP 一.JSON 劫持 二.Callback 可定义导致的安全问题 三.其他文件格式( Content-Type )与 JSON 四.防御 摘自:http://blog.known ...

  8. [转帖]大家分析分析C++ X64X86通用驱动读写API源码教程

    //#include  <windows.h>//#include <algorithm>  //#include <string.h>//#include < ...

  9. ListView 加载数据时 触摸报错

    问题起因: 在做一个从sd卡中加载数据显示在ListView中,由于数据可能比较多,考虑到用户体验,就使用AsyncTask来异步加载,数据一条一条的添加至ListView中. 开始数据比较少的时候, ...

  10. PHP Tips

    开启x_debug,使用var_dump()的显示效果会更好,同时错误也很更详细.