首页/文章/javascript

如何理解-JavaScript-中的sort排序

2023-06-18
12885 分钟
...

sort排序是针对数组中的元素进行升序排序。sort()使用分两种情况

  • 无函数

  • 有函数

无函数

如果sort()方法中无函数,则排序是在将数组中的元素转换为字符串,然后比较元素字符串UTF-16 代码单元值序列(元素按照转换为的字符串的各个字符的 Unicode 位点进行排序。)

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);

Output

[ 1, 100000, 21, 30, 4 ]

注意,这里不是 按照 1,4,21,30,100000顺序排列是因为不是按照number类型排序而是按照元素的字符串形式排序。所以是按照 1,1,2,3,4的顺序,如果第一位相同则比较第二位,以此类推。 所以如果是 1100,120 ,则排序结果不是按照数字排列的 120 ,1100 而是按照字符串排列 。第一位都是 1,看第二位,由于1100第二位是1,而 120第二位是2,1<2,所以 1100 应该在120前面。

有函数

如果 sort()中有函数,则按照函数形式不同,又分为几种情况

箭头函数

// 格式 

sort((a, b) => { /* … */ } )

// 例子

const arr = [1,3,2,5,6,4]

arr.sort((a,b)=>{
  return a-b
})

console.log("@",arr)

Output

[ 1, 2, 3, 4, 5, 6 ]
  • a:第一个用于比较的元素。

  • b:第二个用于比较的元素。

关于 a,b 顺序决定排序方式的规则

  • a-b:则表示升序(如上述代码例子)。a-b > 0 ,则返回正数,a 在b后,保持升序;若 a-b < 0 ,则返回负数,不改变顺序(结果为正,则升序)。这样保证排序方式是升序。

  • b-a:则表示降序。b-a < 0, 则返回负数,b在a后,保持降序; 若 b-a > 0 ,则返回正数,不改变顺序(结果为负,则降序)。这样保证排序方式是降序。

关于为什么升序是 a-b ,而降序是 b-a 的理解

  • a-b :希望前面的参数a是 < 后面的参数 b 。如果满足期望,则不改变顺序,否则调换顺序。

  • b-a: 希望前面的参数a是 > 后面的参数 b。同上。

更加简化的说,排序方式是升序还是降序由 a,b 的大小顺序相反的顺序 决定,默认 a 在前,b在后。

  • 保证升序,只需要a,b呈现降序(a大,b小)的时候,将a,b交换即可保证升序。而a,b呈现降序意味着 a-b > 0 ,所以升序看a-b。【处理降序的情况】

  • 保证降序,只需要a,b呈现升序(a小,b大)的时候,将a,b交换即可保证降序。而a,b呈现升序意味着 a-b < 0 (即 b-a > 0) ,所以降序看 b-a。 【处理升序的情况】

比较函数

比较函数和内联比较函数本质一样,只不过一个将函数名作为回调,一个将函数定义(声明)作为回调。

// 比较函数
    
sort(compareFn) 
    
// 内联比较函数
    
sort(function compareFn(a, b) { /* … */ })
compareFn(a, b) 返回值排序顺序
> 0a 在 b 后
< 0a 在 b 前
=== 0保持 a 和 b 的顺序

比较函数格式如下:

function compareFn(a, b) {
  if (在某些排序规则中a 小于 b) {
    return -1;
  }

  if (在这一排序规则下a 大于 b) {
    return 1;
  }

  // a 一定等于 b
  return 0;
} 

不难看出上述定义的对比函数的功能是用来升序的。可以修改逻辑改为降序的功能。

内联比较函数

略~~~

更多例子

排序对象中的属性

const items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];

// sort by value

items.sort((a, b) => a.value - b.value);

console.log("@sort by value in ascend",items)

// sort by name

items.sort((a, b) => {

  const nameA = a.name.toUpperCase(); // ignore upper and lowercase
  const nameB = b.name.toUpperCase(); // ignore upper and lowercase

  if (nameA < nameB) {
    return -1;
  }

  if (nameA > nameB) {
    return 1;
  }

  // names must be equal

  return 0;

});

console.log("@sort by name in ascend",items)


Output

@sort by value in ascend [

  { name: 'The', value: -12 },

  { name: 'Magnetic', value: 13 },

  { name: 'Edward', value: 21 },

  { name: 'Sharpe', value: 37 },

  { name: 'Zeros', value: 37 },

  { name: 'And', value: 45 }

]

@sort by name in ascend [

  { name: 'And', value: 45 },

  { name: 'Edward', value: 21 },

  { name: 'Magnetic', value: 13 },

  { name: 'Sharpe', value: 37 },
  { name: 'The', value: -12 },

判断排序功能是升序,因为 a-b > 0 的情况下,a,b大小顺序是降序,说明处理的情况是降序,功能与处理情况相反是升序。

总结

  • 在参数是 a,b 顺序的情况下,无论是箭头函数还是自定义对比函数,判断(设计)升序或降序,只需要判断 a-b 的情况,如果 >0 ,则是升序,否则降序。

  • 其中对于箭头函数有一个判断规则:”在参数是 a,b 顺序的情况下,函数体的结果 > 0 , a,b的大小顺序表示需要处理的情况,处理情况相反的情况就是表示该排序的功能“。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
javascript2025-09-18
JavaScript 的多线程能力:Worker
如果你写过一些计算量稍大的 JavaScript 代码,比如图像处理、大量数据排序或者复杂的算法,你几乎肯定遇到过浏览器“卡死”的现象。点击页面没反应,动画也停了,就像整个世界都静止了。 这就是主线程被阻塞的典型后果。因为主线程既要负责执行 JavaScript,又要负责渲染页面、响应用户操作,一旦它被繁重的计算任务占满,就无暇顾及其他,用户体验便直线下降。 这个问题的根源,正是“主线程是单线程的”。那么,如何解决呢? 答案很简单:把这...
学习面试
javascript2025-09-10
手把手教你实现一个EventEmitter
你是不是也遇到过这种情况:代码里各种事件监听和触发,回调函数套了一层又一层,最后自己都理不清哪个事件先触发、哪个后触发了? 别担心,今天我就带你从零开始实现一个自己的事件触发器(EventEmitter),让你彻底掌握事件驱动的精髓,代码清晰度直接提升200%! 为什么要懂EventEmitter? 先说说为什么我们要关心这个。Node.js的核心就是事件驱动,比如文件读写、网络请求,都是通过事件来处理的。不会EventEmitter,...
学习面试
javascript2025-08-09
Web Worker 多线程魔法
你是否曾遇到过网页因为复杂计算而卡顿的情况?今天,让我们一起探索Web Worker的神奇世界,看看如何用多线程技术解决性能瓶颈,并实现流畅的图片压缩功能! 为什么需要Web Worker? 想象一下,你在一个繁忙的餐厅里,只有一位服务员(主线程)负责点餐、上菜、结账所有工作。当客人突然暴增时,这位服务员就会手忙脚乱,其他客人只能干等着… 这就是JavaScript的现状—— 单线程 !所有任务都在一个线程中排队执行,一旦遇到复杂计算(...
学习面试
javascript2025-08-07
🌐AST抽象语法树
AST 是前端开发中一个非常重要的概念,它就像是代码的“编译器”,能够帮助我们理解和操作代码。本文将深入探讨 AST 的原理和应用,带你从零开始了解 AST。 一、什么是 AST? AST(抽象语法树)是一种树形结构,用于表示程序代码的语法结构。它将代码分解为一系列的节点,每个节点代表代码中的一个元素,如变量、函数、表达式等。AST 是编译器和解释器的基础,也是代码分析和转换的关键工具。 1\. AST 的结构 AST 的结构通常包括以...
学习面试
javascript2025-08-05
打字机效果是如何实现的
分析效果 使用 AI 对话的时候,文字是一个字一个字蹦出来的?它不是等所有内容生成完毕后一次性展示,而是以一种流畅、实时的“打字机”效果呈现,这种体验的背后,隐藏着一种高效的Web技术。它就是 服务器推送事件(Server Sent Events,简称 SSE) 什么是 SSE 从根本上说,SSE 是一种允许服务器 单向 、 持续 地向客户端(浏览器)推送数据的Web技术。 可以把它想象成一个 电台广播 : 服务器 是广播电台,持续不断...
学习面试
javascript2025-08-04
Promise 从原理到实现
前言 是 异步编程的核心概念之一,它为我们提供了一种更优雅的方式来处理异步操作。 本文将全面剖析 的工作原理,并逐步实现一个符合 规范的 。 正文 一、Promise 基础概念 代表一个异步操作的最终完成(或失败)及其结果值。它有 种状态: 1. pending : ,既不是成功,也不是失败状态 2. fulfilled :意味着操作 完成 3. rejected :意味着操作 状态一旦改变就不能再变,只能从 变为 ,或从 变为 。 二...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录