JavaScript:遍历两个数组匹配SiteUniqueID并整合描述属性
解决方案:合并两个数组并聚合描述信息
问题背景
有两个数组:
数组1(ID列表):
['0000037_165', '0000037_62', '0000037_74', '0000037_165', ...]
数组2(带描述的对象列表):
[ {SiteUniqueID: '0000037_165', Description: 'Description 1'}, {SiteUniqueID: '0000037_165', Description: 'Description 2'}, {SiteUniqueID: '0000037_62', Description: 'Description 1'}, {SiteUniqueID: '0000037_74', Description: 'Description 1'}, {SiteUniqueID: '0000037_165', Description: 'Description 1'}, ... ]
需求:
- 检查数组2中每个对象的
SiteUniqueID是否存在于数组1中 - 存在的话,将该ID和对应的描述存入新数组
- 同一ID对应多个描述时,把描述整理成数组存储
核心解决方案
用**对象映射(Map)**高效聚合同一ID的描述,再转换为目标数组格式,代码如下:
// 将数组1转为Set,提升ID查询效率(Set.has()是O(1),比数组.includes()的O(n)更快) const idSet = new Set(array1); // 用Map存储每个ID对应的描述数组 const idDescMap = new Map(); // 遍历数组2,筛选并聚合符合条件的描述 array2.forEach(item => { const { SiteUniqueID, Description } = item; if (idSet.has(SiteUniqueID)) { // 若Map中已有该ID,追加描述;否则新建数组存储 idDescMap.has(SiteUniqueID) ? idDescMap.get(SiteUniqueID).push(Description) : idDescMap.set(SiteUniqueID, [Description]); } }); // 将Map转换为目标格式的数组 const result = Array.from(idDescMap.entries()).map(([SiteUniqueID, Description]) => ({ SiteUniqueID, Description })); console.log(result);
代码说明
- Set优化查询:把数组1转为Set,避免大数组下重复查询的性能损耗
- Map聚合描述:用Map的键存储ID,值存储对应描述数组,遍历一次数组2即可完成聚合
- 格式转换:通过
Array.from()将Map的键值对转为数组,再映射成需求的对象结构
适配重复ID场景的版本
如果需要保留数组1中重复ID的条目(比如数组1里两次出现0000037_165,结果也要对应两条),可以调整代码:
const idSet = new Set(array1); const idDescMap = new Map(); // 先聚合所有符合条件的描述 array2.forEach(item => { const { SiteUniqueID, Description } = item; if (idSet.has(SiteUniqueID)) { if (!idDescMap.has(SiteUniqueID)) { idDescMap.set(SiteUniqueID, []); } idDescMap.get(SiteUniqueID).push(Description); } }); // 遍历数组1生成结果,严格保留原数组的顺序和重复次数 const result = array1 .filter(id => idSet.has(id)) .map(id => ({ SiteUniqueID: id, Description: [...idDescMap.get(id)] // 用扩展运算符避免原数组被意外修改 })); console.log(result);
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

