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

本文讲述了作者在解决力扣编程题时,误用JavaScript的sort()方法对包含负数的数组排序,从而遇到问题。作者揭示了sort()方法默认按照Unicode代码点排序的特性,并推荐使用自定义比较函数确保数值排序。此外,文章还介绍了如何根据模糊搜索关键字计算权重并排序数据列表。
摘要由CSDN通过智能技术生成

前言

想着好久没去力扣刷题了,刚好手上的需求也差不多了,就去看了看。看到一个难度级别为困难的题,看到这个题想着直接使用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);

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

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值