如何使用JavaScript reduce方法对订单对象数组做多维度统计
解决方案
核心思路
reduce的第二个参数直接定义为包含所有统计字段的初始对象,额外新增一个Set类型的临时字段存储出现过的doctorId用来计算唯一用户数,遍历完成后再计算最终的派生字段(唯一用户总数、人均销售额)即可。
完整实现代码
const result = orders.reduce((acc, order) => { // 计算当前订单含税金额 const currentAmountWithTax = order.amount * (1 + order.tax); // 更新通用统计字段 acc.totalOrders += 1; acc.allAmountWithTax += currentAmountWithTax; acc.uniqueDoctorIds.add(order.doctorId); // 处理有争议订单统计逻辑 if (order.isDisputed) { acc.totalDisputedOrders += 1; acc.disputedAmountWithTax += currentAmountWithTax; } return acc; }, { // 初始统计对象 totalOrders: 0, totalDisputedOrders: 0, disputedAmountWithTax: 0, allAmountWithTax: 0, uniqueDoctorIds: new Set() }); // 遍历完成后计算派生字段 result.uniqueUserCount = result.uniqueDoctorIds.size; result.avgSalePerUser = result.uniqueUserCount ? (result.allAmountWithTax / result.uniqueUserCount) : 0; // 删除临时存储的Set字段,符合预期输出要求 delete result.uniqueDoctorIds; console.log(result);
输出结果验证
样例数据的输出结果如下,金额可按需调用toFixed(2)保留两位小数:
{ totalOrders: 6, totalDisputedOrders: 3, disputedAmountWithTax: 32448.971, allAmountWithTax: 37006.154799999996, uniqueUserCount: 3, avgSalePerUser: 12335.384933333332 }
注意事项
你原代码中写的collections.reduce需要替换为orders.reduce,和给定的数组变量名保持一致。
内容的提问来源于stack exchange,提问作者nikhilgohil11
相关产品推荐
相关产品推荐

