JavaScript数组部分重排序最优实现:指定索引排序+保留剩余元素
高效实现JavaScript数组部分重排序
要实现「先按指定索引数组排序对应元素,再追加原数组中未被索引包含的剩余元素(保持原顺序)」的需求,且兼顾大规模数组的性能,可以通过以下方式实现:
核心思路
- 用
Set存储需要优先排列的索引,实现O(1)时间复杂度的存在性判断,避免遍历索引数组做重复检查(这对大规模数组至关重要)。 - 分两步构建结果数组:
- 第一步:按索引数组的顺序提取对应元素;
- 第二步:遍历原数组,筛选出不在索引集合中的元素,按原顺序追加到结果末尾。
实现代码
const before = [23, 21, 14, 12, 10, 8, 15]; const indexes = [2, 1, 4, 0]; const reorderByIndexes = (arr, order) => { // 创建索引集合,用于快速判断 const indexSet = new Set(order); // 第一步:提取指定索引的元素 const prioritized = order.map(index => arr[index]); // 第二步:筛选并追加未被索引包含的元素 const remaining = arr.filter((_, index) => !indexSet.has(index)); // 合并结果 return [...prioritized, ...remaining]; }; const after = reorderByIndexes(before, indexes); console.log(after.join()); // 输出:14,21,10,23,12,8,15
性能说明
- 时间复杂度:O(n + m),其中
n是原数组长度,m是索引数组长度。Set的构建和查找都是O(1)级别的操作,避免了嵌套循环带来的O(n*m)复杂度,非常适合处理大规模数组。 - 空间复杂度:O(m),主要来自存储索引的
Set,属于合理的额外空间开销。
补充说明
你提供的示例中期望输出存在笔误(原数组无13元素),上述代码的输出符合逻辑:优先提取索引2,1,4,0对应的14,21,10,23,再追加剩余的12,8,15。
内容的提问来源于stack exchange,提问作者London28
相关产品推荐
相关产品推荐

