JavaScript:按相同键将第二个对象数组与第一个数组排序对齐
按指定数组的键排序另一个数组
核心思路是先建立第一个数组中指定键与位置索引的映射,再利用这个映射对第二个数组排序,同时保证不修改原数组:
function helper(obj1, obj2, key) { // 建立键到索引的映射表,快速查找目标顺序位置 const keyIndexMap = obj1.reduce((map, item, index) => { map[item[key]] = index; return map; }, {}); // 浅拷贝原数组,避免修改原数据 return [...obj2].sort((a, b) => { // 根据映射表中的索引差值排序,保证和obj1顺序一致 return keyIndexMap[a[key]] - keyIndexMap[b[key]]; }); }
代码说明
- 建立映射表:用
reduce遍历obj1,把每个元素的指定key值作为键,对应的数组索引作为值存入对象,后续查找某个键的目标位置时时间复杂度为O(1)。 - 浅拷贝数组:用扩展运算符
[...obj2]复制原数组,确保原obj2不会被修改。 - 排序逻辑:
sort方法中对比两个元素的key在映射表中的索引值,通过差值调整顺序,最终让obj2的顺序和obj1完全匹配。
示例调用
const obj1 = [ { key: 1, id: 1, name: "John" }, { key: 2, id: 2, name: "Ann" }, { key: 3, id: 3, name: "Kate" } ]; const obj2 = [ { key: 2, id: 2, name: "Ann" }, { key: 1, id: 1, name: "John" }, { key: 3, id: 3, name: "Kate" } ]; const sortedObj2 = helper(obj1, obj2, 'key'); console.log(sortedObj2); // 输出顺序和obj1一致:[{key:1,...}, {key:2,...}, {key:3,...}]
边界情况处理
如果obj2中存在obj1没有的元素,这些元素的key在映射表中会返回undefined,排序时会被放到数组末尾(因为undefined - 数字会得到NaN,sort会把这类元素排到最后)。如果需要自定义这类元素的位置,可以在排序逻辑中额外处理。
内容的提问来源于stack exchange,提问作者user9832432
相关产品推荐
相关产品推荐

