如何对比两个对象数组,返回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);
代码说明
- 构建映射表:用
Object.fromEntries把obj1转成{ type: games数组 }的结构,避免每次查找对应平台都遍历数组,提升效率。 - 遍历对比:
- 遍历
obj2的每个平台项,取出type和游戏列表。 - 对每个游戏,和
obj1同平台同索引的游戏对比name和id,只要其中一个值不同,就把当前平台类型、游戏的name和id加入结果数组。
- 遍历
- 边界处理:如果
obj1中没有对应平台,或者游戏数量不一致,直接跳过这些情况(如果需要处理新增游戏的场景,可以调整逻辑)。
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

