You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:46:04