前言
想着好久没去力扣刷题了,刚好手上的需求也差不多了,就去看了看。看到一个难度级别为困难的题,看到这个题想着直接使用JS现成的方法,先concat
再sort
。再取中间值不就实现了吗。是不是你们也这么想,哈哈哈。
就是上面的思路,果然很快,运行也通过了例子,然后提交,内心想(小菜一碟,轻松写完)。没想到却报错了吗,打脸太快。太自信也不行哇,来看看报上面错,竟然是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);
本想抄近路实现算法题,还踩了个小坑。不过建议还是不使用封装好的方法取做,刷题就是为了练习。