JavaScript对象数组分组重构:合并收件人订阅信息需求
解决方案:收件人订阅数据聚合与扩展结构实现
基础需求:按收件人ID聚合订阅服务ID
先将serviceSubscriptions数组按recipientId分组,再把每组的serviceId拼接为逗号分隔的字符串:
const serviceSubscriptions = [ { recipientId: "13251376", serviceId: "3218143" }, { recipientId: "13251376", serviceId: "15656200" }, { recipientId: "13251376", serviceId: "3721" }, { recipientId: "13251316", serviceId: "3218143" } ]; // 分组处理 const groupedSubs = serviceSubscriptions.reduce((acc, item) => { acc[item.recipientId] = acc[item.recipientId] || []; acc[item.recipientId].push(item.serviceId); return acc; }, {}); // 转换为目标格式 const aggregatedResult = Object.entries(groupedSubs).map(([id, services]) => ({ recipientId: id, services: services.join(',') })); console.log(aggregatedResult);
输出结果与示例完全一致:
[{"recipientId":"13251376","services":"3218143,15656200,3721"},{"recipientId":"13251316","services":"3218143"}]
扩展需求:结合收件人数组生成两种结构
先准备示例数据并提前构建订阅映射(提升查询效率):
// 示例收件人数组 const recipients = [ { recipientId: "13251376", name: "Alice" }, { recipientId: "13251316", name: "Bob" }, { recipientId: "13251388", name: "Charlie" } ]; // 示例订阅记录数组 const serviceSubscriptions = [ { recipientId: "13251376", serviceId: "3218143" }, { recipientId: "13251376", serviceId: "15656200" }, { recipientId: "13251376", serviceId: "3721" }, { recipientId: "13251316", serviceId: "3218143" } ]; // 提前生成所有服务ID集合(用于第二种需求) const allServiceIds = [...new Set(serviceSubscriptions.map(s => s.serviceId))]; // 构建收件人-订阅服务的映射表,快速查询 const recipientSubMap = serviceSubscriptions.reduce((acc, item) => { acc[item.recipientId] = acc[item.recipientId] || new Set(); acc[item.recipientId].add(item.serviceId); return acc; }, {});
需求1:新增isSubscribed与services字段
遍历收件人数组,结合映射表添加对应字段:
const result1 = recipients.map(recipient => { const subscribedServices = recipientSubMap[recipient.recipientId] || new Set(); return { ...recipient, isSubscribed: subscribedServices.size > 0, services: Array.from(subscribedServices).join(',') }; }); console.log(result1);
输出示例:
[ {"recipientId":"13251376","name":"Alice","isSubscribed":true,"services":"3218143,15656200,3721"}, {"recipientId":"13251316","name":"Bob","isSubscribed":true,"services":"3218143"}, {"recipientId":"13251388","name":"Charlie","isSubscribed":false,"services":""} ]
需求2:新增subscriptions状态对象
遍历收件人数组,为每个收件人生成以服务ID为键、订阅状态为值的对象:
const result2 = recipients.map(recipient => { const subscribedServices = recipientSubMap[recipient.recipientId] || new Set(); const subscriptions = allServiceIds.reduce((acc, serviceId) => { acc[serviceId] = subscribedServices.has(serviceId); return acc; }, {}); return { ...recipient, subscriptions }; }); console.log(result2);
输出示例:
[ {"recipientId":"13251376","name":"Alice","subscriptions":{"3218143":true,"15656200":true,"3721":true}}, {"recipientId":"13251316","name":"Bob","subscriptions":{"3218143":true,"15656200":false,"3721":false}}, {"recipientId":"13251388","name":"Charlie","subscriptions":{"3218143":false,"15656200":false,"3721":false}} ]
内容的提问来源于stack exchange,提问作者David Garcia
相关产品推荐
相关产品推荐

