JavaScript按employee_name和commission_date汇总commission_price
按员工姓名+日期汇总佣金金额的解决方案
你之前的代码只把employee_name作为分组依据,所以只会按员工汇总所有日期的佣金,没考虑同一员工不同日期的区分。要实现按员工姓名+日期共同分组,核心是构建一个包含两个字段的复合键来标识唯一分组。
修正后的代码
const data = [ { "employee_name": "Employee A", "commission_date": "14/05/2018", "commission_price": 9000 }, { "employee_name": "Employee A", "commission_date": "17/05/2018", "commission_price": 5000 }, { "employee_name": "Employee B", "commission_date": "18/05/2018", "commission_price": 2000 }, { "employee_name": "Employee B", "commission_date": "18/05/2018", "commission_price": 5000 }, { "employee_name": "Employee B", "commission_date": "19/05/2018", "commission_price": 500 } ]; const result = Object.values(data.reduce((acc, curr) => { // 构建复合键:员工姓名+日期,确保同一员工同一天的记录被归为一组 const key = `${curr.employee_name}|${curr.commission_date}`; // 如果该分组不存在,初始化分组对象 if (!acc[key]) { acc[key] = { employee_name: curr.employee_name, commission_date: curr.commission_date, commission_price: 0 }; } // 累加当前记录的佣金金额 acc[key].commission_price += curr.commission_price; return acc; }, {})); console.log(result);
代码说明
- 复合键设计:用
${employee_name}|${commission_date}作为分组的唯一标识,这样同一员工同一天的所有记录会被映射到同一个key下,不同员工或不同日期的记录会被区分开。 - 分组初始化:当第一次遇到某个复合键时,创建一个包含员工姓名、日期,且佣金初始为0的对象。
- 佣金累加:每遍历一条记录,就将对应分组的佣金加上当前记录的金额。
输出结果
运行后会得到你期望的格式:
[ { "employee_name": "Employee A", "commission_date": "14/05/2018", "commission_price": 9000 }, { "employee_name": "Employee A", "commission_date": "17/05/2018", "commission_price": 5000 }, { "employee_name": "Employee B", "commission_date": "18/05/2018", "commission_price": 7000 }, { "employee_name": "Employee B", "commission_date": "19/05/2018", "commission_price": 500 } ]
内容的提问来源于stack exchange,提问作者Pengguna
相关产品推荐
相关产品推荐

