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

JavaScript:如何根据原对象数组的id顺序对目标对象数组进行排序

如何根据原数组的ID顺序对目标数组排序?

没问题,这其实很容易实现,核心思路是先建立原数组ID的位置映射,再用这个映射来给目标数组排序。我给你一步步拆解:

先明确你的示例数据

// 原数组
const originalArray = [{id:1, name:'A'},{id:2, name:'B'},{id:3, name:'C'},{id:4, name:'D'},{id:5, name:'E'}];
// 目标数组
const newArray = [{id:3, name:'C'},{id:5, name:'E'},{id:2, name:'B'}];

步骤1:建立ID到原数组索引的映射

我们先遍历原数组,生成一个id -> 索引的映射对象,这样可以快速查找每个ID在原数组中的位置:

const idOrderMap = originalArray.reduce((map, item, index) => {
  map[item.id] = index;
  return map;
}, {});
// 生成的map是:{1:0, 2:1, 3:2, 4:3, 5:4}

步骤2:用映射对目标数组排序

利用数组的sort方法,通过比较元素ID在原数组中的索引值来排序:

// 注意:用[...newArray]创建副本,避免修改原目标数组;不需要保留原数组的话可以直接用newArray.sort()
const sortedNewArray = [...newArray].sort((a, b) => {
  return idOrderMap[a.id] - idOrderMap[b.id];
});

// 输出结果就是你想要的:
// [{id:2, name:'B'},{id:3, name:'C'},{id:5, name:'E'}]

处理边界情况(可选)

如果目标数组中存在原数组没有的ID,比如{id:6, name:'F'},默认排序会出现异常。你可以选择:

  • 把未知ID的元素排到最后:
const sortedNewArray = [...newArray].sort((a, b) => {
  // 用Infinity把未知ID的元素推到末尾
  const indexA = idOrderMap[a.id] ?? Infinity;
  const indexB = idOrderMap[b.id] ?? Infinity;
  return indexA - indexB;
});
  • 直接过滤掉未知ID的元素:
const sortedNewArray = newArray
  .filter(item => idOrderMap.hasOwnProperty(item.id))
  .sort((a, b) => idOrderMap[a.id] - idOrderMap[b.id]);

为什么这个方法高效?

建立映射的时间复杂度是O(n)(n是原数组长度),排序的时间复杂度是O(m log m)(m是目标数组长度),比每次排序都去原数组查找ID(O(m*n log m))要高效得多,尤其当数组规模较大时优势明显。

内容的提问来源于stack exchange,提问作者asanas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:22:43