JavaScript对象数组按条件合并:为Recipient对象补充订阅信息
问题
我有以下三个JavaScript对象数组:
let recipients = [{"blackList":"0","clawfulBasis":"3","cmOneID":"0","id":"13251316","jurisdiction":"SCPB - LON","name":"David G","relationshipManager":"Adam Cavalier","subscription":"","_schema":"nms:recipient"},{"blackList":"0","clawfulBasis":"3","cmOneID":"666666","id":"13251376","jurisdiction":"Guernsey","name":"David Llanos Changed Garcia","relationshipManager":"Adam Cavalier","_schema":"nms:recipient"}]; let services = [{"id":"3218143","name":"SVC27","label":"UK > Financial Advisers > Services"},{"id":"3721","name":"newsletter","label":"Newsletter"},{"id":"15656200","name":"SVC35","label":"Sustainability"}] let serviceSubscriptions = [{"recipientId":"13251316","serviceId":"3218143"},{"recipientId":"13251376","serviceId":"15656200"},{"recipientId":"13251376","serviceId":"15656200"},{"recipientId":"13251376","serviceId":"3721"}]
其中serviceSubscriptions存储了收件人与订阅服务的关联关系,我需要以Recipient对象的id和serviceSubscriptions的recipientId为匹配依据,给每个Recipient对象补充去重后的serviceId数组,预期效果示例如下:
{"blackList":"0","clawfulBasis":"3","cmOneID":"666666","id":"13251376","jurisdiction":"Guernsey","name":"David Llanos Changed Garcia","relationshipManager":"Adam Cavalier","subscriptions":"[3218143,15656200,3721]","_schema":"nms:recipient"}
解决方案
实现逻辑
- 先将
serviceSubscriptions转换为以recipientId为键的映射表,利用Set自动去重,避免重复遍历订阅数组,提升处理效率; - 遍历
recipients数组,为每个收件人添加subscriptions字段,从映射表中取出对应去重后的serviceId数组,并格式化为示例要求的字符串格式。
代码实现
// 构建收件人订阅映射表,自动去重serviceId const subscriptionMap = serviceSubscriptions.reduce((map, item) => { const { recipientId, serviceId } = item; if (!map[recipientId]) { map[recipientId] = new Set(); } map[recipientId].add(serviceId); return map; }, {}); // 为每个收件人补充订阅信息 const updatedRecipients = recipients.map(recipient => { const serviceIds = Array.from(subscriptionMap[recipient.id] || []); return { ...recipient, subscriptions: `[${serviceIds.join(',')}]` }; }); // 打印结果 console.log(JSON.stringify(updatedRecipients, null, 2));
运行结果
执行后updatedRecipients的输出内容如下:
[ { "blackList": "0", "clawfulBasis": "3", "cmOneID": "0", "id": "13251316", "jurisdiction": "SCPB - LON", "name": "David G", "relationshipManager": "Adam Cavalier", "subscription": "", "_schema": "nms:recipient", "subscriptions": "[3218143]" }, { "blackList": "0", "clawfulBasis": "3", "cmOneID": "666666", "id": "13251376", "jurisdiction": "Guernsey", "name": "David Llanos Changed Garcia", "relationshipManager": "Adam Cavalier", "_schema": "nms:recipient", "subscriptions": "[15656200,3721]" } ]
内容的提问来源于stack exchange,提问作者David Garcia
相关产品推荐
相关产品推荐

