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

JavaScript:比较两个数组并生成保留重复项的匹配新数组

问题描述

我有两个数组,想要比较它们并生成包含匹配值的新数组,同时保留重复项。现有代码如下:

let array1 = [1, 3, 3, 3]
let array2 = [{id:1}, {id:2},{id:3}]

array1 = array1.filter(e1 => array2.some(e2 => e2.id === e1))
array2 = array2.filter(e1 => array1.some(e2 => e2 === e1.id))

当前输出是:

array2 = [{id:1}, {id:3}]

但我需要保留重复项,期望输出为:

array2=[{id:1}, {id:3}, {id:3}, {id:3}] // 因为array1中3出现多次
解决方案

原来的filter方法只会保留array2中符合条件的唯一元素,没法实现重复项的保留。要达到需求,应该遍历array1的每一个元素,找到array2中对应id的对象,然后把这些对象收集起来:

方法一:构建映射表提升性能

如果array2元素较多,先把array2转成以id为键的映射表,能避免每次查找都遍历array2,提升效率:

let array1 = [1, 3, 3, 3];
let array2 = [{id:1}, {id:2},{id:3}];

// 构建id到对应对象的映射
const idMap = new Map(array2.map(item => [item.id, item]));

// 遍历array1,收集匹配的对象
const result = array1.map(id => idMap.get(id)).filter(Boolean);

console.log(result); // 输出: [{id:1}, {id:3}, {id:3}, {id:3}]

方法二:直接遍历查找(适合小数据量)

如果array2元素数量很少,也可以直接在array1的遍历过程中查找对应元素:

let array1 = [1, 3, 3, 3];
let array2 = [{id:1}, {id:2},{id:3}];

const result = array1.map(id => array2.find(item => item.id === id)).filter(Boolean);

console.log(result); // 输出: [{id:1}, {id:3}, {id:3}, {id:3}]

说明

  • map方法会根据array1的每个元素生成对应的array2对象,array1中的重复元素自然会重复生成对应对象
  • filter(Boolean)用于过滤array1中不存在于array2的id(如果有这类情况),若确定array1的所有id都能在array2中找到,可省略这一步

内容的提问来源于stack exchange,提问作者Manas S. Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:55:34