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

请求协助:混合结构用户订单JSON数据的聚合处理

处理订单JSON数据的聚合方案

需求概述

需要处理包含两种订单类型(individual和bulk)的JSON数据,最终按用户聚合:

  • 汇总每个用户参与的所有订单ID
  • 统计每个用户所有订单中的唯一商品数量

输入示例数据

[
  {
    "orderid": "1111",
    "order_type": "individual",
    "users": [
      {
        "name": "user1",
        "phone": 982928,
        "items": [
          {
            "name": "AAA",
            "qty": 20,
            "price": 10
          },
          {
            "name": "BBB",
            "qty": 30,
            "price": 15
          }
        ]
      },
      {
        "name": "user2",
        "phone": 948783,
        "items": [
          {
            "name": "AAA",
            "qty": 10,
            "price": 10
          },
          {
            "name": "CCC",
            "qty": 5,
            "price": 20
          }
        ]
      },
      {
        "name": "user3",
        "phone": 787868,
        "items": [
          {
            "name": "BBB",
            "qty": 40,
            "price": 10
          },
          {
            "name": "CCC",
            "qty": 15,
            "price": 20
          }
        ]
      }
    ]
  },
  {
    "orderid": "2222",
    "order_type": "bulk",
    "users": [
      {
        "name": "user1",
        "phone": 982928
      },
      {
        "name": "user3",
        "phone": 787868
      }
    ],
    "items": [
      {
        "name": "AAA",
        "qty": 3,
        "price": 10
      },
      {
        "name": "BBB",
        "qty": 15,
        "price": 10
      }
    ]
  }
]

期望输出

[
  {
    "user":"user1",
    "orders":[1111,2222],
    "unique_items":2
  },
  {
    "user":"user2",
    "orders":[1111],
    "unique_items":2
  },
  {
    "user":"user3",
    "orders":[1111,2222],
    "unique_items":3
  }
]

实现代码(JavaScript)

// 输入订单数据
const ordersData = [/* 上述输入JSON数据 */];

// 初始化用户聚合容器,键为用户名,值存订单列表和商品集合
const userAggregator = {};

// 遍历每一笔订单
ordersData.forEach(order => {
  const orderId = parseInt(order.orderid);
  if (order.order_type === 'individual') {
    // 处理个人订单:每个用户拥有独立商品
    order.users.forEach(user => {
      const userName = user.name;
      // 首次处理用户时初始化数据
      if (!userAggregator[userName]) {
        userAggregator[userName] = {
          orders: [],
          items: new Set()
        };
      }
      // 添加订单ID(避免重复)
      if (!userAggregator[userName].orders.includes(orderId)) {
        userAggregator[userName].orders.push(orderId);
      }
      // 将当前用户的商品加入集合(自动去重)
      user.items.forEach(item => {
        userAggregator[userName].items.add(item.name);
      });
    });
  } else if (order.order_type === 'bulk') {
    // 处理批量订单:所有用户共享商品
    const bulkItemNames = order.items.map(item => item.name);
    order.users.forEach(user => {
      const userName = user.name;
      // 首次处理用户时初始化数据
      if (!userAggregator[userName]) {
        userAggregator[userName] = {
          orders: [],
          items: new Set()
        };
      }
      // 添加订单ID(避免重复)
      if (!userAggregator[userName].orders.includes(orderId)) {
        userAggregator[userName].orders.push(orderId);
      }
      // 批量添加共享商品到集合
      bulkItemNames.forEach(name => {
        userAggregator[userName].items.add(name);
      });
    });
  }
});

// 转换为期望的输出格式
const result = Object.entries(userAggregator).map(([user, data]) => ({
  user,
  orders: data.orders.sort((a, b) => a - b),
  unique_items: data.items.size
}));

console.log(JSON.stringify(result, null, 2));

逻辑说明

  1. 聚合容器初始化:用对象userAggregator存储每个用户的订单列表和商品集合(Set特性自动去重,适合统计唯一商品数量)
  2. 订单遍历处理:
    • individual订单:逐个处理用户,将用户的个人订单ID和商品分别加入对应集合
    • bulk订单:先提取所有共享商品名称,再给每个参与用户添加订单ID和共享商品
  3. 格式转换:将聚合对象转为数组格式,同时统计商品集合的大小作为唯一商品数量,对订单ID排序保证输出有序

内容的提问来源于stack exchange,提问作者neeraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:09:50