JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)

简介: Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等

---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

image.gif 编辑

JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序(洗牌算法)、优化排序性能等,JS中排序算法的使用详解(附实际应用代码)

image.gif 编辑

一、为什么要使用Array.sort()

       Array.sort() 是 JavaScript 中用于数组排序的内置方法。表面上看,它只是一个对数组元素进行升序或降序排列的工具,但深入理解其用法后会发现,它不仅支持灵活的排序逻辑,还能结合其他数组方法,实现复杂的数据操作和优化性能。本文将从基本语法入手,逐步讲解 Array.sort() 的复杂用法,并通过丰富的实战案例,展示其在开发中的强大应用。

二、Array.sort() 的使用与技巧

1、基础语法

       Array.sort() 方法用于对数组中的元素进行原地排序,并返回排序后的数组。默认情况下,sort() 会将数组元素转换为字符串并按字典序排序

array.sort([compareFunction]);

       compareFunction(可选):用于定义排序顺序的函数。它接收两个参数 a 和 b:

  • 如果返回值 < 0,则 a 排在 b 前面。
  • 如果返回值 > 0,则 b 排在 a 前面。
  • 如果返回值为 0,则两者位置保持不变。

2、返回值

       Array.sort() 会按照比较器的规则修改原数组,直至排序完成,不会产生新的数组。

3、使用技巧

       Array.sort() 的核心其实就是比较函数,大多数时候需要我们自己写一个满足实际需求的比较函数。

       如果直接比较数字数组排序,会出现"10"<"6"之类的情况,因为在字符串中是先比较第一位,再往后逐步推进,“1”在字符串中在“6”前面,"1"<"6",就不会再比较第二位了,所以"10"<"6"。

       这里举个例子:

const numbers = [25, 100, 9, 2];
numbers.sort();
console.log(numbers); 
// 输出:[100, 2, 25, 9] (按照字典序排序)

image.gif

       如果只是想排序数字数组,可以写一个简单的比较函数。

const numbers = [25, 100, 9, 2];
numbers.sort((a, b) => a - b); // 升序排序
console.log(numbers); 
// 输出:[2, 9, 25, 100]

image.gif

三、Array.sort() 的复杂用法与实际应用案例

1、多字段排序(适用于对象元素的数组,数据库排序)

       在实际开发中,数据对象往往需要根据多个字段排序。例如,一个用户列表需要先按角色排序,再按用户名排序。

const users = [
  { name: 'Alice', age: 25, role: 'user' },
  { name: 'Bob', age: 22, role: 'admin' },
  { name: 'Charlie', age: 35, role: 'user' },
  { name: 'Dave', age: 30, role: 'admin' },
];
// 按角色升序,角色相同时按年龄升序
users.sort((a, b) => {
  if (a.role === b.role) {
    return a.age - b.age; // 按年龄升序
  }
  return a.role.localeCompare(b.role); // 按角色字典序
});
console.log(users);
/*
输出:
[
  { name: 'Bob', age: 22, role: 'admin' },
  { name: 'Dave', age: 30, role: 'admin' },
  { name: 'Alice', age: 25, role: 'user' },
  { name: 'Charlie', age: 35, role: 'user' }
]
*/

image.gif

2、按日期排序

       可以通过将日期字符串转换为 Date 对象来实现排序。

const events = [
  { name: 'Event A', date: '2024-11-20' },
  { name: 'Event B', date: '2023-12-25' },
  { name: 'Event C', date: '2024-01-01' },
];
events.sort((a, b) => new Date(a.date) - new Date(b.date));
console.log(events);
/*
输出:
[
  { name: 'Event B', date: '2023-12-25' },
  { name: 'Event C', date: '2024-01-01' },
  { name: 'Event A', date: '2024-11-20' }
]
*/

image.gif

3、排序稳定性

       从 ECMAScript 2019 开始,Array.sort() 变为稳定排序。即对于排序权重相同的元素,它们的相对顺序不会改变。

const items = [
  { name: 'Apple', weight: 3 },
  { name: 'Banana', weight: 1 },
  { name: 'Cherry', weight: 1 },
];
items.sort((a, b) => a.weight - b.weight);
console.log(items);
/*
输出:
[
  { name: 'Banana', weight: 1 },
  { name: 'Cherry', weight: 1 },
  { name: 'Apple', weight: 3 }
]
*/

image.gif

4、随机排序(洗牌算法)

       实现数组的随机排序(伪随机)。

const array = [1, 2, 3, 4, 5];
array.sort(() => Math.random() - 0.5);
console.log(array);
// 输出:随机排列的数组,例如:[3, 1, 5, 2, 4]

image.gif

5、排序结合映射优化性能

       当数组较大且需要频繁比较时,可以先对数据进行映射(映射到简单值),然后排序,最后恢复原始结构。这种方式可以显著提升性能。

const data = [
  { name: 'Alice', score: 90 },
  { name: 'Bob', score: 75 },
  { name: 'Charlie', score: 95 },
];
// 1. 生成映射
const mapped = data.map((item, index) => ({ index, value: item.score }));
// 2. 排序
mapped.sort((a, b) => b.value - a.value); // 按分数降序
// 3. 根据映射还原
const result = mapped.map(m => data[m.index]);
console.log(result);
/*
输出:
[
  { name: 'Charlie', score: 95 },
  { name: 'Alice', score: 90 },
  { name: 'Bob', score: 75 }
]
*/

image.gif

6、自定义自然排序

       在处理文件名或编号时,可以实现自然排序,使得数字能够按照数值大小排列。

const filenames = ['file1.txt', 'file20.txt', 'file3.txt'];
filenames.sort((a, b) => {
  const numA = parseInt(a.match(/\d+/)[0], 10);
  const numB = parseInt(b.match(/\d+/)[0], 10);
  return numA - numB;
});
console.log(filenames);
// 输出:['file1.txt', 'file3.txt', 'file20.txt']

image.gif

7、排序和分组结合

       利用 sort() 和 reduce(),可以实现数据的分组和排序。

const orders = [
  { id: 1, category: 'Electronics', total: 200 },
  { id: 2, category: 'Clothing', total: 50 },
  { id: 3, category: 'Electronics', total: 100 },
  { id: 4, category: 'Clothing', total: 75 },
];
// 按类别分组并排序
const groupedAndSorted = orders
  .sort((a, b) => a.category.localeCompare(b.category) || b.total - a.total)
  .reduce((groups, order) => {
    const { category } = order;
    groups[category] = groups[category] || [];
    groups[category].push(order);
    return groups;
  }, {});
console.log(groupedAndSorted);
/*
输出:
{
  Clothing: [
    { id: 4, category: 'Clothing', total: 75 },
    { id: 2, category: 'Clothing', total: 50 }
  ],
  Electronics: [
    { id: 1, category: 'Electronics', total: 200 },
    { id: 3, category: 'Electronics', total: 100 }
  ]
}
*/

image.gif

四、总结

       Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。

       只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

       其他热门文章,请关注:

       你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

       极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

       通过array.filter()实现数组的数据筛选、数据清洗和链式调用

       TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

       el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

       MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

       Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

       在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

       通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

       JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南

       干货含源码!如何用Java后端操作Docker(命令行篇)

       Idea启动SpringBoot程序报错:Port 8082 was already in use;端口冲突的原理与解决方案

相关文章
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
119 0
|
4月前
|
资源调度 JavaScript 前端开发
Day.js极简轻易快速2kB的JavaScript库-替代Moment.js
dayjs是一个极简快速2kB的JavaScript库,可以为浏览器处理解析、验证、操作和显示日期和时间,它的设计目标是提供一个简单、快速且功能强大的日期处理工具,同时保持极小的体积(仅 2KB 左右)。
244 24
|
4月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
101 4
|
4月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
116 3
|
4月前
|
存储 监控 算法
公司内部网络监控中的二叉搜索树算法:基于 Node.js 的实时设备状态管理
在数字化办公生态系统中,公司内部网络监控已成为企业信息安全管理体系的核心构成要素。随着局域网内终端设备数量呈指数级增长,实现设备状态的实时追踪与异常节点的快速定位,已成为亟待解决的关键技术难题。传统线性数据结构在处理动态更新的设备信息时,存在检索效率低下的固有缺陷;而树形数据结构因其天然的分层特性与高效的检索机制,逐渐成为网络监控领域的研究热点。本文以二叉搜索树(Binary Search Tree, BST)作为研究对象,系统探讨其在公司内部网络监控场景中的应用机制,并基于 Node.js 平台构建一套具备实时更新与快速查询功能的设备状态管理算法框架。
116 3
|
5月前
|
传感器 存储 算法
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
本程序基于ECC(椭圆曲线密码学)簇内分组密钥管理算法,对无线传感器网络(WSN)进行MATLAB性能仿真。通过对比网络通信开销、存活节点数量、网络能耗及数据通信量四个关键指标,验证算法的高效性和安全性。程序在MATLAB 2022A版本下运行,结果无水印展示。算法通过将WSN划分为多个簇,利用ECC生成和分发密钥,降低计算与通信成本,适用于资源受限的传感器网络场景,确保数据保密性和完整性。
|
6月前
|
监控 算法 JavaScript
企业用网络监控软件中的 Node.js 深度优先搜索算法剖析
在数字化办公盛行的当下,企业对网络监控的需求呈显著增长态势。企业级网络监控软件作为维护网络安全、提高办公效率的关键工具,其重要性不言而喻。此类软件需要高效处理复杂的网络拓扑结构与海量网络数据,而算法与数据结构则构成了其核心支撑。本文将深入剖析深度优先搜索(DFS)算法在企业级网络监控软件中的应用,并通过 Node.js 代码示例进行详细阐释。
110 2
|
6月前
|
存储 算法 JavaScript
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
88 6

热门文章

最新文章