当前位置:首页 > JavaScript

js实现sort

2026-01-31 23:46:42JavaScript

实现 JavaScript 的排序功能

JavaScript 提供了 Array.prototype.sort() 方法来实现数组排序。该方法默认将元素转换为字符串后按 Unicode 码点排序,但可以通过自定义比较函数实现更复杂的排序逻辑。

基本用法(默认排序)

默认情况下,sort() 方法会将数组元素转换为字符串后排序:

const fruits = ['banana', 'apple', 'orange', 'grape'];
fruits.sort();
console.log(fruits); // ['apple', 'banana', 'grape', 'orange']

对于数字数组,默认排序可能不符合预期:

const numbers = [10, 2, 5, 1, 9];
numbers.sort();
console.log(numbers); // [1, 10, 2, 5, 9](按字符串比较)

自定义比较函数

要实现数字排序或其他自定义排序,需要提供比较函数:

const numbers = [10, 2, 5, 1, 9];
numbers.sort((a, b) => a - b); // 升序
console.log(numbers); // [1, 2, 5, 9, 10]

numbers.sort((a, b) => b - a); // 降序
console.log(numbers); // [10, 9, 5, 2, 1]

比较函数应返回:

js实现sort

  • 负数:a 应排在 b 前面
  • 正数:b 应排在 a 前面
  • 0:顺序不变

对象数组排序

对于对象数组,可以基于对象属性排序:

const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 20 }
];

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

字符串排序(区分大小写)

默认的字符串排序区分大小写(大写字母排在小写字母前面):

const words = ['apple', 'Banana', 'cherry', 'Date'];
words.sort();
console.log(words); // ['Banana', 'Date', 'apple', 'cherry']

要实现不区分大小写的排序:

js实现sort

words.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));
console.log(words); // ['apple', 'Banana', 'cherry', 'Date']

稳定排序

从 ES2019 开始,sort() 被要求是稳定排序(相同值的元素保持原始相对顺序):

const data = [
  { value: 1, order: 1 },
  { value: 2, order: 2 },
  { value: 1, order: 3 }
];

data.sort((a, b) => a.value - b.value);
console.log(data);
// [
//   { value: 1, order: 1 },
//   { value: 1, order: 3 },
//   { value: 2, order: 2 }
// ]

性能注意事项

sort() 的时间复杂度取决于具体实现,现代浏览器通常使用 TimSort 或类似算法,平均时间复杂度为 O(n log n)。对于大型数组,可能需要考虑性能优化。

实现自定义排序算法

虽然通常建议使用内置的 sort() 方法,但了解排序算法实现也有价值。以下是快速排序的 JavaScript 实现:

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++) {
    arr[i] < pivot ? left.push(arr[i]) : right.push(arr[i]);
  }
  return [...quickSort(left), pivot, ...quickSort(right)];
}

const nums = [5, 3, 8, 4, 2];
console.log(quickSort(nums)); // [2, 3, 4, 5, 8]

标签: jssort
分享给朋友:

相关文章

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…