请求协助:混合结构用户订单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));
逻辑说明
- 聚合容器初始化:用对象
userAggregator存储每个用户的订单列表和商品集合(Set特性自动去重,适合统计唯一商品数量) - 订单遍历处理:
individual订单:逐个处理用户,将用户的个人订单ID和商品分别加入对应集合bulk订单:先提取所有共享商品名称,再给每个参与用户添加订单ID和共享商品
- 格式转换:将聚合对象转为数组格式,同时统计商品集合的大小作为唯一商品数量,对订单ID排序保证输出有序
内容的提问来源于stack exchange,提问作者neeraj
相关产品推荐
相关产品推荐

