如何依据参考数组的指定顺序对目标数组进行排序
按参考列表顺序排序的实现方案
你要实现的效果核心逻辑是:将目标数组中存在于参考列表的元素,按参考列表的顺序排在最前面,剩余不存在于参考列表的元素,保持其在原目标数组中的相对顺序排在后面,以下是两种常用的JavaScript实现:
方案1:直接拼接法(逻辑最简单,性能更优)
这种方法不需要调用排序函数,直接拆分数组再拼接,适合需求固定的场景:
const array1 = [1,2,3,4,5,6]; const array2 = [4,6,3]; const referenceSet = new Set(array2); // 按参考列表顺序取存在于目标数组的元素 const orderedPart = array2.filter(item => array1.includes(item)); // 取目标数组中不在参考列表的元素,保持原顺序 const restPart = array1.filter(item => !referenceSet.has(item)); // 拼接得到结果 const result = [...orderedPart, ...restPart]; console.log(result); // 输出 [4,6,3,1,2,5]
方案2:自定义排序法(灵活度更高)
如果后续需要叠加其他排序规则,推荐用自定义排序的方式实现:
const array1 = [1,2,3,4,5,6]; const array2 = [4,6,3]; // 存储参考列表元素的优先级,索引越小排序越靠前 const priorityMap = new Map(array2.map((item, index) => [item, index])); // 存储目标数组元素的原始索引,保证剩余元素保持原相对顺序 const originalIndexMap = new Map(array1.map((item, index) => [item, index])); const result = [...array1].sort((a, b) => { const aPriority = priorityMap.get(a); const bPriority = priorityMap.get(b); // 两个元素都在参考列表中,按优先级排序 if (aPriority !== undefined && bPriority !== undefined) { return aPriority - bPriority; } // 只有a在参考列表中,a排在前面 if (aPriority !== undefined) return -1; // 只有b在参考列表中,b排在前面 if (bPriority !== undefined) return 1; // 都不在参考列表中,按原数组的索引排序 return originalIndexMap.get(a) - originalIndexMap.get(b); }); console.log(result); // 输出 [4,6,3,1,2,5]
注意:如果参考列表array2存在重复元素,建议提前对array2去重后再生成Map/Set,避免排序逻辑异常。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

