当前位置:首页 > JavaScript

实现js sort

2026-02-01 04:00:24JavaScript

实现 JavaScript 的 sort 方法

JavaScript 的 sort 方法用于对数组元素进行排序,默认按字符串 Unicode 码点排序。以下是几种常见的实现方式和注意事项。

基本用法

默认情况下,sort 会将元素转换为字符串并比较 Unicode 码点:

const arr = [10, 2, 5, 1];
arr.sort(); // 结果为 [1, 10, 2, 5]

自定义排序函数

通过传递比较函数,可以实现数字或其他复杂类型的排序:

const arr = [10, 2, 5, 1];
arr.sort((a, b) => a - b); // 升序排序,结果为 [1, 2, 5, 10]
arr.sort((a, b) => b - a); // 降序排序,结果为 [10, 5, 2, 1]

对象数组排序

对对象数组按某个属性排序:

实现js sort

const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 20 }
];
users.sort((a, b) => a.age - b.age); // 按 age 升序排序

字符串排序

对字符串数组按字母顺序排序(区分大小写):

const names = ['Alice', 'bob', 'Charlie'];
names.sort(); // 结果为 ['Alice', 'Charlie', 'bob']

不区分大小写的排序:

实现js sort

names.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));

稳定性

现代 JavaScript 引擎实现了稳定的排序(相同值的元素顺序不变),但早期版本可能不稳定。

性能注意事项

sort 的时间复杂度通常为 O(n log n),但具体实现取决于浏览器或 Node.js 的引擎。

手动实现快速排序

以下是一个简单的快速排序实现:

function quickSort(arr) {
  if (arr.length <= 1) return arr;
  const pivot = arr[0];
  const left = [];
  const right = [];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] < pivot) left.push(arr[i]);
    else right.push(arr[i]);
  }
  return [...quickSort(left), pivot, ...quickSort(right)];
}

注意事项

  • sort 会修改原数组
  • 比较函数应返回负数、零或正数
  • 对于大型数组,内置 sort 通常比手动实现的算法更高效

标签: jssort
分享给朋友:

相关文章

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…