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

如何对比两个对象数组,返回obj2中含类型的差异对象?

实现方案

核心思路

先把原始数组obj1按type构建映射表,方便快速定位对应平台的游戏列表;再遍历修改后的数组obj2,逐个对比同平台同位置游戏的name和id,一旦发现差异就收集符合要求的对象。

代码实现

// 原始数组和修改后数组(示例数据)
const obj1 = [
  {
    type: "mobile",
    games: [
      { name: "Temple Run", id: 2259 },
      { name: "Subway Surfer", id: 2271 },
      { name: "Pubg", id: 2272 },
    ],
  },
  {
    type: "pc",
    games: [
      { name: "Pubg", id: 222 },
      { name: "Fortnite", id: 2274 },
      { name: "Nfs", id: 2272 },
    ],
  },
];

const obj2 = [
  {
    type: "mobile",
    games: [
      { name: "Temple Runs", id: 2259 },
      { name: "Subway Surfer", id: 2271 },
      { name: "Pubg", id: 2272 },
    ],
  },
  {
    type: "pc",
    games: [
      { name: "Pubgs", id: 222 },
      { name: "Fortnite", id: 2274 },
      { name: "Nfs", id: 2272 },
    ],
  },
];

// 构建obj1的type映射表,快速获取对应平台的游戏列表
const obj1TypeMap = Object.fromEntries(obj1.map(item => [item.type, item.games]));
const changedObj = [];

// 遍历obj2查找差异
obj2.forEach(platform => {
  const { type, games } = platform;
  const originalGames = obj1TypeMap[type];
  
  // 如果obj1中没有对应类型,直接跳过
  if (!originalGames) return;

  games.forEach((game, index) => {
    const originalGame = originalGames[index];
    // 如果obj1中对应位置没有游戏,直接跳过
    if (!originalGame) return;

    // 对比name或id是否有差异
    if (game.name !== originalGame.name || game.id !== originalGame.id) {
      changedObj.push({
        type,
        name: game.name,
        id: game.id
      });
    }
  });
});

console.log(changedObj);

代码说明

  1. 构建映射表:用Object.fromEntries把obj1转成{ type: games数组 }的结构,避免每次查找对应平台都遍历数组,提升效率。
  2. 遍历对比:
    • 遍历obj2的每个平台项,取出type和游戏列表。
    • 对每个游戏,和obj1同平台同索引的游戏对比name和id,只要其中一个值不同,就把当前平台类型、游戏的name和id加入结果数组。
  3. 边界处理:如果obj1中没有对应平台,或者游戏数量不一致,直接跳过这些情况(如果需要处理新增游戏的场景,可以调整逻辑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:05:34