如何过滤比对两个对象数组并匹配存储指定partner_code
解决方法
先通过Map预处理webusers数据,把每个client_id对应的最终partner_code计算好,再批量给objects赋值,能大幅提升大数组场景下的性能。
步骤说明:
- 预处理webusers:遍历一次webusers,用Map记录每个client_id对应的所有partner_code集合
- 确定最终partner_code:遍历这个Map,根据规则生成每个client_id要使用的partner_code
- 赋值给objects:遍历objects,通过client.id直接从Map中取对应的partner_code赋值
代码示例(JavaScript):
// 1. 收集每个client_id对应的所有partner_code const clientPartnerSetMap = new Map(); webusers.forEach(user => { const { client_id, partner_code } = user; if (!clientPartnerSetMap.has(client_id)) { clientPartnerSetMap.set(client_id, new Set()); } clientPartnerSetMap.get(client_id).add(partner_code); }); // 2. 根据规则生成每个client_id的最终partner_code const finalPartnerMap = new Map(); clientPartnerSetMap.forEach((codeSet, clientId) => { if (codeSet.size > 1 && codeSet.has('rtm') && codeSet.has('team1')) { finalPartnerMap.set(clientId, 'team1'); } else { // 若只有一个code直接取,多个但不满足rtm+team1的情况取第一个(可按需调整) finalPartnerMap.set(clientId, [...codeSet][0]); } }); // 3. 给objects的partner_code字段赋值 objects.forEach(obj => { obj.partner_code = finalPartnerMap.get(obj.client.id) || ''; });
性能优势:
之前嵌套使用filter()/find()的方式,每次处理一个object都要遍历整个webusers数组,时间复杂度为O(O * W)(O是objects长度,W是webusers长度)。而预处理方式的时间复杂度为O(W + O),数组越大,性能提升越显著。
内容的提问来源于stack exchange,提问作者Tony M.
相关产品推荐
相关产品推荐

