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

如何基于键值对条件统计用户服务数量并生成新数组

按用户名+服务名称统计服务数量的解决方案

问题描述

我有如下格式的数组,需要**基于用户名(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);

代码说明

  1. reduce遍历累加:用reduce遍历输入数组,初始化空对象作为累加容器。
  2. 唯一键生成:通过username和serviceName拼接成唯一键,保证同一用户的同一服务会被合并。
  3. 数量合并:若键不存在则存入元素副本;若已存在则累加quantity值。
  4. 转换为数组:用Object.values将累加容器中的值提取为数组,得到最终结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:50:44