基于docId匹配两个集合,返回双方共有的合并文档
基于docId匹配并合并两个集合的交集文档
要实现仅保留两个集合中docId匹配的文档,并将colB中的smtp字段合并到colA的对应文档中,可按以下方式操作:
实现思路
- 把
colB转换为以docId为键、smtp为值的Map,实现O(1)时间复杂度的快速查找 - 遍历
colA,筛选出存在对应docId的文档,并将smtp字段合并到文档中
代码实现
// 假设UUID函数已定义 const colA = [ { _id: UUID('8af051fd-feaa-4a81-b34f-327513210eab'), docId: '12345689', name: 'Office 1', country: 'Spain' }, { _id: UUID('87c36ae2-5e9f-4cda-9bf5-087e96fb71b9'), docId: '12345680', name: 'Office 2', country: 'San Tomé e Príncipe' }, { _id: UUID('7ec73cb0-657a-4a91-861c-fccf04c8c2a7'), docId: '12345688', name: 'Office 3', country: 'Canada' } ]; const colB = [ { id: 1, docId: '12345689', name: 'Office 1', smtp: null }, { id: 2, docId: '12345680', name: 'Office 2', smtp: 'smtp.gmail.com' }, { id: 3, docId: '12345688', name: 'Office 3', smtp: 'smtp.office365' }, { id: 4, docId: '12345638', name: 'Office 4', smtp: 'smtp.host.com' }, { id: 5, docId: '12345699', name: 'Office 5', smtp: '123.321.456' }, ]; // 构建colB的docId与smtp的映射关系 const bSmtpMap = new Map(colB.map(item => [item.docId, item.smtp])); // 生成最终结果集 const result = colA .filter(item => bSmtpMap.has(item.docId)) .map(item => ({ ...item, smtp: bSmtpMap.get(item.docId) })); console.log(result);
补充说明
- 采用Map结构替代嵌套循环,将整体时间复杂度从O(n*m)优化为O(n+m),适合处理大规模数据
- 使用扩展运算符(
...)复制原文档属性,避免修改原始集合数据 - 最终结果仅保留两个集合中
docId匹配的文档,自动合并smtp字段
内容的提问来源于stack exchange,提问作者DValdir Martins
相关产品推荐
相关产品推荐

