JavaScript数组匹配:遍历数组按ID查找并保留重复项需求
问题与解决方案
问题描述
初始需求
有两个数组:
array1 = [1, 2, 3] array2 = [{id:1}, {id:1}, {id:3}]
需要获取array2中所有id存在于array1的对象数组(比如收集所有id为1的对象)。
更新后需求
当array1包含重复值时,需要结果数组的元素重复次数与array1中对应id的次数一致。例如:
let array1 = [1, 3, 3, 3] let array2 = [{id:1}, {id:2},{id:3}]
使用filter+some的方法得到的结果是[{id:1}, {id:3}],但期望结果为[{id:1}, {id:3}, {id:3}, {id:3}]。
解决方案
针对更新后的核心需求(匹配array1的重复次数)
方法一:利用Map提升查找效率
const array1 = [1, 3, 3, 3]; const array2 = [{id:1}, {id:2},{id:3}]; // 将array2转换为id到对象的映射,快速查找 const idObjMap = new Map(array2.map(item => [item.id, item])); // 遍历array1,收集对应id的对象,过滤掉无匹配的情况 const result = array1.map(id => idObjMap.get(id)).filter(Boolean); console.log(result); // 输出: [{id:1}, {id:3}, {id:3}, {id:3}]
方法二:直接遍历查找(适合小数据量)
const array1 = [1, 3, 3, 3]; const array2 = [{id:1}, {id:2},{id:3}]; const result = []; for (const id of array1) { const matchItem = array2.find(item => item.id === id); if (matchItem) { result.push(matchItem); } } console.log(result); // 输出期望结果
针对初始需求(收集array2中所有id在array1的对象,保留array2自身的重复)
如果只需要保留array2中所有符合id条件的对象(不管array1的重复,只看是否存在),可以用Set来快速判断:
const array1 = [1, 2, 3]; const array2 = [{id:1}, {id:1}, {id:3}]; const idSet = new Set(array1); const result = array2.filter(item => idSet.has(item.id)); console.log(result); // 输出: [{id:1}, {id:1}, {id:3}]
内容的提问来源于stack exchange,提问作者Manas S. Roy
相关产品推荐
相关产品推荐

