JavaScript数组sort()对负数排序的陷阱

前言

想着好久没去力扣刷题了,刚好手上的需求也差不多了,就去看了看。看到一个难度级别为困难的题,看到这个题想着直接使用JS现成的方法,先concatsort。再取中间值不就实现了吗。是不是你们也这么想,哈哈哈。
在这里插入图片描述
就是上面的思路,果然很快,运行也通过了例子,然后提交,内心想(小菜一碟,轻松写完)。没想到却报错了吗,打脸太快。太自信也不行哇,来看看报上面错,竟然是sort方法出错了。
在这里插入图片描述

解析:

JavaScript 的 sort() 方法默认情况下是按照 Unicode 代码点进行排序的。对于数字,如果数组包含负数,直接使用 sort() 可能不会按照数值的正常顺序进行排序。就是上面的报错了,没错就是它。

示例:

let numbers = [10, 5, 7, 2, -1, -6];numbers.sort();
console.log(numbers);
// 输出: [-1, -6, 10, 2, 5, 7]

在这个例子中,sort() 方法将数组元素转换为字符串并按照 Unicode 代码点进行排序,导致了 -1 排在 -6 前面。

为了正确排序包含负数的数组,应该使用自定义的比较函数,如下所示:

let numbers = [10, 5, 7, 2, -1, -6];numbers.sort(function(a, b) {return a - b;
});
console.log(numbers);
// 输出: [-6, -1, 2, 5, 7, 10]

通过自定义比较函数,确保 sort() 按照数值的顺序进行排序,而不是按照字符串的顺序。比较函数应
该返回负数、零或正数,表示第一个参数小于、等于或大于第二个参数。

解读sort方法

使用

使用很简单,应该大家都会哈,就不罗嗦了。

var numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];  
numbers.sort();  
// 或者自定义排序方法
numbers.sort((a, b)=> a-b); 
// 反序
numbers.sort((a, b)=> b-a); 
console.log(numbers); // 输出 [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

根据权重排序

很多时候页面上会有模糊搜索的情况,如果我们直接将匹配到关键字的数据展示,不容易找到最想搜的数据,那么测试或者产品就可能要求你根据匹配度来排个序。虽然很多时候搜索功能都是后端提供的接口,难免会遇到仅前端搜索的。思路就是计算权重,然后排序
给个例子可以参考一下:

// 简化的文章对象
const articles = [{ title: "JavaScript Basics", content: "JavaScript is a programming language..." },{ title: "Advanced JavaScript", content: "In this article, we will explore advanced JavaScript concepts..." },// ... 其他文章
];// 简化的搜索函数
function search(query, articles) {// 将搜索关键字拆分成数组const keywords = query.toLowerCase().split(" ");// 计算每篇文章的权重const results = articles.map(article => {const titleWeight = keywords.reduce((weight, keyword) => {// 这里includes浏览器的兼容性不如indexOf,但大部分浏览器都兼容return weight + (article.title.toLowerCase().includes(keyword) ? 1 : 0);// return matchCount + (article.title.toLowerCase().indexOf(keyword) !== -1 ? 1 : 0);}, 0);const contentWeight = keywords.reduce((weight, keyword) => {return weight + (article.content.toLowerCase().includes(keyword) ? 1 : 0);//return matchCount + (article.content.toLowerCase().indexOf(keyword) !== -1 ? 1 : 0);}, 0);// 总权重计算,这里简单相加,你可以根据需要进行加权const totalWeight = titleWeight + contentWeight;return { article, totalWeight };});// 根据总权重进行排序,权重越高的排在前面results.sort((a, b) => b.totalWeight - a.totalWeight);return results.map(result => result.article);
}// 示例搜索
const query = "JavaScript programming";
const searchResults = search(query, articles);
console.log(searchResults);

本想抄近路实现算法题,还踩了个小坑。不过建议还是不使用封装好的方法取做,刷题就是为了练习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/611494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11 个 Python全栈开发工具集

前言 以下是专注于全栈开发不同方面的 Python 库;有些专注于 Web 应用程序开发,有些专注于后端,而另一些则两者兼而有之。 1. Taipy Taipy 是一个开源的 Python 库,用于构建生产就绪的应用程序前端和后端。 它旨在加快应用程序开发&#xf…

2024--Django平台开发-Django知识点(五)

day05 django知识点 今日概要: 中间件 【使用】【源码】cookie 【使用】【源码 - Django底层请求本质】session【使用】【源码 - 数据库请求周期中间件】 1.中间件 1.1 使用 编写类,在类型定义:process_request、process_view、process_…

【C++】STL 算法 ⑨ ( 预定义函数对象示例 - 将容器元素从大到小排序 | sort 排序算法 | greater<T> 预定义函数对象 )

文章目录 一、预定义函数对象示例 - 将容器元素从大到小排序1、sort 排序算法2、greater<T> 预定义函数对象 二、代码示例 - 预定义函数对象1、代码示例2、执行结果 一、预定义函数对象示例 - 将容器元素从大到小排序 1、sort 排序算法 C 标准模板库 ( STL , Standard Te…

离散数学-二元关系

4.1关系的概念 1)序偶及n元有序组 由两个个体x和y&#xff0c;按照一定顺序排序成的、有序数组称为有序偶或有序对、二元有序组&#xff0c; 记作<x&#xff0c;y>&#xff0c;其中x是第一分量&#xff0c;y是第二分量。 相等有序偶&#xff1a;第一分量和第二分量分…

游戏开发中,你的游戏图片压缩格式使用ASTC了吗

文章目录 ASTC原理&#xff1a;使用要求 ASTC&#xff08;Adaptive Scalable Texture Compression&#xff0c;自适应可伸缩纹理压缩&#xff09;是一种高级的纹理压缩技术&#xff0c;由ARM公司开发并推广。它在图形处理领域中因其出色的压缩效率和灵活性而受到广泛关注。 AST…

前端国际化之痛点(二):多包多库场景下联动多语言

前言 VoerkaI18n是一款非常优秀的前端国际化解决方案&#xff0c;其开发的出发点是为了解决现存多语言的一些痛点,接下来几篇文章将分别进行分析。 前端国际化之痛点(一)&#xff1a;让人头疼的词条Key前端国际化之痛点(二)&#xff1a;多包多库场景下联动多语言前端国际化之…

Jetson Orin AGX 64GB更新 Jetpack6.0

Jetson Orin AGX 64GB更新 Jetpack6.0 注意&#xff1a; 1&#xff0c;如果你要向我一样为AGX更新Jetpack6.0的话&#xff0c;它还要求你的ubuntu版本必须是20.04 或22.04 2&#xff0c;安装完SDKmanager后&#xff0c;然后选择对应的设备&#xff0c;根据个人选择勾选是否安装…

【Mysql】InnoDB 引擎中的页目录

一、页目录和槽 现在知道记录在页中按照主键大小顺序串成了单链表。 那么我使用主键查询的时候&#xff0c;最顺其自然的办法肯定是从第一条记录&#xff0c;也就是 Infrimum 记录开始&#xff0c;一直向后找&#xff0c;只要存在总会找到。这种在数据量少的时候还好说&#x…

四、K8S-Deployment(无状态服务)

目录 一、引入Deployment 二、Deployment资源清单 三、Deployment支持的功能 1、扩缩容 1、通过命令行方式修改 2 、在线编辑yaml文件方式修改 2、镜像更新 1、重建更新 2、滚动更新 3、金丝雀发布&#xff08;灰度更新&#xff09; [rootk8s-master-1 ~]# kubectl g…

centos用yum安装mysql详细教程

1 查询安装mysql的yum源,命令如下 ls /etc/yum.repos.d/ -l 界面如下图所示&#xff0c;未显示mysql的安装源 2 安装mysql相关的yum源,例如&#xff1a; 例如&#xff1a;rpm -ivh mysql57-community-release-el7.rpm 要注意 mysql的版本和系统的版本匹配 mysql57-communi…

【高等数学之泰勒公式】

一、从零开始 1.1、泰勒中值定理1 什么是泰勒公式?我们先看看权威解读: 那么我们从古至今到底是如何创造出泰勒公式的呢? 由上图可知&#xff0c;任一无穷小数均可以表示成用一系列数字的求和而得出的结果&#xff0c;我们称之为“无穷算法”。 那么同理我们想对任一曲线来…

Qt/QML编程学习之心得:hicar手机投屏到车机中控的实现(32)

hicar,是华为推出的一款手机APP,有百度地图、华为音乐,更多应用中还有很多对应手机上装在的其他APP,都可以在这个里面打开使用,对开车的司机非常友好。但它不仅仅是用在手机上,它还可以投屏到车机中控上,这是比较神奇的一点。 HiCar本质上是一套智能投屏系统,理论上所有…

springboot 企业微信 网页授权

html 引入jquery $(function () {// alert("JQ onready");// 当前企业的 corp_idconst corp_id xxxxxx;// 重定向 URL → 最终打开的画面地址&#xff0c;域名是在企业微信上配置好的域名const redirect_uri encodeURI(http://xxxxx.cn);//企业的agentId 每个应用都…

Vue3-39-路由-导航异常的检测 afterEatch 与 编程式导航之后的订阅动作

说明 本文主要是介绍一下 路由的后置守卫 afterEatch 的一个重要的作用 &#xff1a; 就是检测路由异常信息。 它的实现方式是 通过第三个参数来返回的。 而且&#xff0c;它的异常检测是全局的。导航的异常有以下三种类型&#xff1a; aborted : 在导航守卫中 被拦截并返回了…

【Blog】记录一下如何让自己的自建网站让百度搜索收录

记录一下如何让自己的自建网站让百度搜索收录 目录 记录一下如何让自己的自建网站让百度搜索收录一、前言二、开始操作1、第一步&#xff1a;进入设置2、第二步&#xff1a;开始设置3、第三步&#xff1a;让百度收录我们自己的文章 三、知识点记录1、注意事项2、可能会出现的问…

vsCode输出控制台中文乱码解决

在tasks.json里的args中添加 "-fexec-charsetGBK", // 处理mingw中文编码问题 "-finput-charsetUTF-8",// 处理mingw中文编码问题

PyCharm 设置新建Python文件时自动在文章开头添加固定注释的方法

在实际项目开发时&#xff0c;为了让编写的每个代码文件易读、易于维护或方便协同开发时&#xff0c;我们都会在每一个代码文件的开头做一些注释&#xff0c;如作者&#xff0c;文档编写时间&#xff0c;文档的功能说明等。 利用PyCharm 编辑器&#xff0c;我们只需设置相关设…

微机原理常考简答题总结

一&#xff0c;8086和8088这两个微处理器在结构上有什么异同&#xff1f; &#xff08;1&#xff09;共同点&#xff1a;内部均由EU、BIU组成&#xff0c;结构基本相同&#xff1b;寄存器等功能部件均为16位&#xff1b;内部数据通路为16位&#xff1b;指令系统相同。 &#x…

网络协议与攻击模拟_03实施ARP欺骗和攻击

一、ARP攻击 1、实验环境 kali Linux &#xff08;安装arpspoof工具&#xff09;被攻击主机 2、kali配置 kali Linux系统是基于debian Linux系统&#xff0c;采用deb包管理方式&#xff0c;可以使用apt源的方式进行直接从源的安装。 配置kali网络源 vim /etc/apt/sources…

Android学习(四):常用布局

Android学习&#xff08;四&#xff09;&#xff1a;常用布局 五种常用布局 线性布局&#xff1a;以水平或垂直方向排列相对布局&#xff1a;通过相对定位排列帧布局&#xff1a;开辟空白区域&#xff0c;帧里的控件(层)叠加表格布局&#xff1a;表格形式排列绝对布局&#x…