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
相关产品推荐
相关产品推荐

