如何将任务金额按员工ID均分并汇总?JSON数据处理求助
问题:按员工ID拆分任务金额并汇总
现有Task数组数据如下:
var Task = [{ id1: 01, id2: 02, money: 400 },{ id1: 03, id2: 02, money: 200 },{ id1: 01, id2: 02, id3: 03, money: 300 }]
需要将数据整理为员工数组,规则为:
- 含3个ID的任务,金额除以3后分配给每个ID对应的员工
- 含2个ID的任务,金额除以2后分配给每个ID对应的员工
期望得到的结果:
var employee = [{ id: 001, money: 400 },{ id: 002, money: 400 },{ id: 003, money: 100 }]
尝试的代码仅支持单个ID处理,无法满足需求:
var nv = nhanvien.reduce((acc, cur) => { var existingnhanvien = nhanvien.find(o => o.id1 === cur.id ) if (existingnhanvien) { existingnhanvien.money= parseInt(existingnhanvien.money+ cur.money) } else { acc.push({ id: cur.id1, money: cur.money }) } return acc }, [])
解决方案
实现步骤
- 逐个处理每个任务:先把任务里的
id1、id2、id3都提取出来,只保留真实存在的ID - 计算每个ID的分配金额:任务总金额除以当前任务的有效ID数量(2个ID就除以2,3个就除以3)
- 用
reduce汇总员工金额:如果ID已在员工列表中,就累加对应金额;如果不在,就新增员工条目
完整代码
const Task = [ { id1: 1, id2: 2, money: 400 }, { id1: 3, id2: 2, money: 200 }, { id1: 1, id2: 2, id3: 3, money: 300 } ]; const employee = Task.reduce((acc, task) => { // 提取当前任务的所有有效ID,自动适配2个或3个ID的场景 const validIds = [task.id1, task.id2, task.id3].filter(id => id !== undefined); // 计算每个ID应得的金额 const perPersonShare = task.money / validIds.length; validIds.forEach(id => { // 在累加器中查找当前ID对应的员工 const targetEmp = acc.find(emp => emp.id === id); if (targetEmp) { // 员工已存在,累加金额 targetEmp.money += perPersonShare; } else { // 员工不存在,新增条目 acc.push({ id, money: perPersonShare }); } }); return acc; }, []); // 可选:格式化ID为3位数字、金额转为整数,匹配期望结果格式 const finalEmployee = employee.map(emp => ({ id: emp.id.toString().padStart(3, '0'), money: parseInt(emp.money) })); console.log(finalEmployee);
代码说明
- 通过
filter过滤未定义的ID,无需单独判断任务是2个还是3个ID,逻辑更通用 - 分钱逻辑直接按规则计算,简单清晰
- 遍历每个ID更新员工金额,确保所有参与任务的员工都能分到对应份额
- 最后的格式化步骤可按需调整,如果不需要3位ID或保留小数,直接使用
employee数组即可
内容的提问来源于stack exchange,提问作者thang khac
相关产品推荐
相关产品推荐

