当前位置:首页 > 问答 > 正文

面试达人必备:精通sort函数,让数组排序变得游刃有余

📢 面试达人必备:精通sort函数,让数组排序变得游刃有余

最新动态 🚀(2025-09-15):
据最新《开发者技能调查报告》显示,85%的技术面试会考察候选人对数组排序的掌握程度,而sort()函数因其灵活性和高频使用率,成为面试官最爱的考察点之一!无论是前端、后端还是算法岗,熟练使用sort()都能让你在编码环节脱颖而出✨。


🔍 sort函数基础:快速入门

基本用法

sort()是JavaScript数组的原生方法,默认按Unicode编码升序排列:

const fruits = ['banana', 'Apple', 'orange'];
fruits.sort(); // ['Apple', 'banana', 'orange'](注意A的Unicode小于b)

⚠️ 陷阱:默认排序会将数字转为字符串再比较,导致[10, 2, 5].sort()结果为[10, 2, 5]


自定义排序规则

通过传递比较函数(compareFunction),实现精准控制:

arr.sort((a, b) => a - b); // 数字升序
arr.sort((a, b) => b - a); // 数字降序

原理

  • 返回负数a排在b
  • 返回正数b排在a
  • 返回0 → 顺序不变

🎯 面试高频场景实战

对象数组排序

按对象属性排序(如按年龄升序):

const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 20 }
];
users.sort((a, b) => a.age - b.age);

多条件排序

先按年龄升序,年龄相同再按名字字母排序:

users.sort((a, b) => {
  if (a.age !== b.age) return a.age - b.age;
  return a.name.localeCompare(b.name);
});

中文排序

使用localeCompare解决中文编码问题:

面试达人必备:精通sort函数,让数组排序变得游刃有余

const cities = ['北京', '上海', '广州'];
cities.sort((a, b) => a.localeCompare(b, 'zh-CN'));

随机排序(洗牌算法)

面试可能要求手写数组乱序:

arr.sort(() => Math.random() - 0.5); // 简易版(非完全均匀)

💡 底层原理与性能优化

V8引擎的排序策略

  • 短数组(≤10):使用插入排序(稳定)
  • 长数组:快速排序(不稳定) + 插入排序优化

稳定性问题

sort()在JS中不稳定(相同值可能换位),若需稳定排序可自行实现或使用库(如Lodash的_.sortBy)。

面试达人必备:精通sort函数,让数组排序变得游刃有余

时间复杂度

  • 最优:O(n log n)
  • 最差:O(n²)(极端情况下,如数组已有序)

🚨 常见面试题与坑点

问题1:以下代码输出什么?

[null, undefined, 10, 1].sort();

答案[1, 10, null, undefined]nullundefined会被排到最后)

问题2:如何实现不区分大小写的字母排序?

答案

['Apple', 'banana'].sort((a, b) => 
  a.toLowerCase().localeCompare(b.toLowerCase())
);

📚 延伸学习资源


掌握sort()函数,不仅能轻松应对面试,更能提升日常开发效率!🎉 下次面试官让你“手写排序”时,记得微微一笑,优雅敲出arr.sort((a, b) => a - b)