如何依据作为主数组键的参考数组顺序对主数组排序?
如何依据指定ID数组的顺序对主数组排序?
假设我们有如下主数组:
let mainArray = [{ "id": 24443, "name": "Apple" }, { "id": 20172, "name": "Banana" }, { "id": 187016, "name": "Cherry" }, { "id": 217632, "name": "Guava" }, { "id": 5221, "name": "Peach" }, { "id": 97568, "name": "Strawberry" }]
以及用于指定排序顺序的ID数组:
let idArray = [ "24443", "20172", "5221", "187016", "217632", "97568" ]
我们需要按照idArray中ID的出现顺序,对mainArray进行排序,下面是两种最优的实现方法:
方法一:利用映射表实现高效排序(通用场景)
这种方法适合大多数场景,尤其是当主数组可能存在额外元素,或者你需要保留原数组不变时使用。核心思路是先建立ID到排序索引的映射,再用这个映射来指导排序:
// 第一步:创建ID与排序位置的映射表 const idOrderMap = new Map(); idArray.forEach((id, index) => { idOrderMap.set(id, index); }); // 第二步:对主数组进行排序(展开运算符用于避免修改原数组) const sortedMainArray = [...mainArray].sort((a, b) => { // 统一类型:把主数组的数字id转成字符串,和idArray的格式匹配 const aIndex = idOrderMap.get(String(a.id)); const bIndex = idOrderMap.get(String(b.id)); return aIndex - bIndex; });
为什么这是最优的?
建立映射表的时间复杂度是O(m)(m是idArray的长度),排序的时间复杂度是O(n log n)(n是mainArray的长度),整体效率很高。而且如果主数组里有不在idArray中的元素,它们会被自动排到最后(因为get返回undefined,相减后是NaN,会被放在末尾)。
方法二:直接构建排序后的数组(匹配场景)
如果能保证idArray中的每个ID都在mainArray中存在,且两者长度完全一致,那么可以用这种时间复杂度为O(n)的方法,直接按顺序构建新数组:
const sortedMainArray = idArray.map(id => { // 同样要注意类型统一,把主数组的id转成字符串对比 return mainArray.find(item => String(item.id) === id); });
优点:比排序更快,实现代码更简洁;注意事项:如果idArray里有mainArray不存在的ID,对应的位置会返回undefined,所以只适合两者完全匹配的场景。
内容的提问来源于stack exchange,提问作者Abhay Shiro
相关产品推荐
相关产品推荐

