如何基于键值对条件统计用户服务数量并生成新数组
按用户名+服务名称统计服务数量的解决方案
问题描述
我有如下格式的数组,需要**基于用户名(username)+ 服务名称(serviceName)**统计关联服务的总数量,生成指定格式的输出。我试过forEach和reduce但没得到预期结果,求解决方案。
输入数组
[ { "customerNo": 1001, "username": "user3", "serviceName": "Tempo", "quantity": 1 }, { "customerNo": 1002, "username": "user4", "serviceName": "Social", "quantity": 1 }, { "customerNo": 1001, "username": "user3", "serviceName": "Mango", "quantity": 1 }, { "customerNo": 1001, "username": "user3", "serviceName": "Mango", "quantity": 1 }, { "customerNo": 1003, "username": "user5", "serviceName": "Social", "quantity": 1 }, { "customerNo": 1002, "username": "user4", "serviceName": "Social", "quantity": 1 } ]
期望输出
[ { "customerNo": 1001, "username": "user3", "serviceName": "Tempo", "quantity": 1 }, { "customerNo": 1001, "username": "user3", "serviceName": "Mango", "quantity": 2 }, { "customerNo": 1002, "username": "user4", "serviceName": "Social", "quantity": 2 }, { "customerNo": 1003, "username": "user5", "serviceName": "Social", "quantity": 1 } ]
解决方案
使用reduce方法即可实现需求,核心思路是用用户名+服务名作为唯一标识键来合并数量,最后将对象转换为数组。代码如下:
// 替换为你的输入数组 const inputArray = [ { "customerNo": 1001, "username": "user3", "serviceName": "Tempo", "quantity": 1 }, { "customerNo": 1002, "username": "user4", "serviceName": "Social", "quantity": 1 }, { "customerNo": 1001, "username": "user3", "serviceName": "Mango", "quantity": 1 }, { "customerNo": 1001, "username": "user3", "serviceName": "Mango", "quantity": 1 }, { "customerNo": 1003, "username": "user5", "serviceName": "Social", "quantity": 1 }, { "customerNo": 1002, "username": "user4", "serviceName": "Social", "quantity": 1 } ]; const result = Object.values(inputArray.reduce((acc, item) => { // 生成唯一键,确保同一用户的同一服务被归类 const uniqueKey = `${item.username}_${item.serviceName}`; if (!acc[uniqueKey]) { // 首次出现时,存入元素副本(避免修改原数组) acc[uniqueKey] = { ...item }; } else { // 已存在则累加数量 acc[uniqueKey].quantity += item.quantity; } return acc; }, {})); console.log(result);
代码说明
reduce遍历累加:用reduce遍历输入数组,初始化空对象作为累加容器。- 唯一键生成:通过
username和serviceName拼接成唯一键,保证同一用户的同一服务会被合并。 - 数量合并:若键不存在则存入元素副本;若已存在则累加
quantity值。 - 转换为数组:用
Object.values将累加容器中的值提取为数组,得到最终结果。
内容的提问来源于stack exchange,提问作者gaurav c
相关产品推荐
相关产品推荐

