当前位置:首页 » 《休闲阅读》 » 正文

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

3 人参与  2024年11月29日 16:01  分类 : 《休闲阅读》  评论

点击全文阅读


目录

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

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

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

1、基础语法

2、返回值

3、使用技巧

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

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

2、按日期排序

3、排序稳定性

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

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

6、自定义自然排序

7、排序和分组结合

四、总结


作者:watermelo37

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

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

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

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

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

一、为什么要使用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] (按照字典序排序)

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

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

三、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' }]*/

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' }]*/

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 }]*/

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

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

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

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 }]*/

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']

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 }  ]}*/

四、总结

        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;端口冲突的原理与解决方案


点击全文阅读


本文链接:http://zhangshiyu.com/post/193994.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1