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
相关产品推荐
相关产品推荐

