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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:50:44