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_…

优化改进YOLOv5算法之Dilation-wise Residual(DWR)可扩张残差注意力模块,增强多尺度感受野特征,助力小目标检测

目录 1 Dilation-wise Residual模块原理 1.1 设计动机 1.2 Dilation-wise Residual模块 1.2.1 Design idea and structure 1.2.2 Parameter design

【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…

【笔记】Helm-2 如何使用-2 同步你的仓库

同步你的仓库 注意&#xff1a;该示例是专门针对Google Cloud Storage&#xff08;GCS&#xff09;提供的chart仓库。 先决条件 安装gsutil工具。我们非常依赖gsutil rsync功能 https://cloud.google.com/storage/docs/gsutil 确保可以使用Helm程序 可选&#xff1a;我们推…

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;我们称之为“无穷算法”。 那么同理我们想对任一曲线来…

vue上传文件时显示进度

在Vue中上传多个文件并实时刷新进度条&#xff0c;可以通过使用HTML5的File API和XMLHttpRequest对象来实现。下面是一个简单的示例代码&#xff0c;演示了如何实现这个功能&#xff1a; 首先&#xff0c;在Vue组件中添加一个用于选择文件的input元素和一个用于显示进度条的di…

Qt 智能指针QScopedPoint用法

1. 智能指针是什么 智能指针是C11引入的一种指针封装类型&#xff0c;用于自动管理动态分配的内存。智能指针的目的是解决传统裸指针带来的内存泄漏、悬挂指针等问题&#xff0c;并使代码更安全、更易读。 2. 智能指针有什么用 1.自动管理内存&#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 每个应用都…

C++中的深度优先搜索算法

C中的深度优先搜索算法 深度优先搜索&#xff08;DFS&#xff09;是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点…

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

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

Python 格式化的方法

在Python中&#xff0c;我们可以使用字符串的format()方法或f-string这两种方法来进行格式化。 1、使用format()方法&#xff1a;使用该方法&#xff0c;我们可以通过占位符{}来表示被替换的值&#xff0c;其中可以单独使用{}或添加变量参数来指定相应的值。如&#xff1a; n…