You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript数组部分重排序最优实现:指定索引排序+保留剩余元素

高效实现JavaScript数组部分重排序

要实现「先按指定索引数组排序对应元素,再追加原数组中未被索引包含的剩余元素(保持原顺序)」的需求,且兼顾大规模数组的性能,可以通过以下方式实现:

核心思路

  1. 用Set存储需要优先排列的索引,实现O(1)时间复杂度的存在性判断,避免遍历索引数组做重复检查(这对大规模数组至关重要)。
  2. 分两步构建结果数组:
    • 第一步:按索引数组的顺序提取对应元素;
    • 第二步:遍历原数组,筛选出不在索引集合中的元素,按原顺序追加到结果末尾。

实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:08:20