API返回订单数组按日期统计配送费仅显示最后一条结果如何解决
问题根因
- 引用类型复用错误:全程只实例化了一个
dateWiseDataObject对象,JS中对象为引用类型,数组push的是对象的内存地址,后续修改对象属性时,数组中已存入的元素会同步被修改,最终所有元素值都会和最后一次修改后的对象一致。 - 漏存最后一天数据:只有遇到日期不匹配的订单时才会触发push操作,遍历完全部订单后,最后一天的统计数据还停留在临时对象中,没有被存入结果数组。
- 逻辑前提不合理:通过
endDate逐日累加匹配日期的逻辑,要求订单必须严格按createdAt升序排列,一旦订单时间乱序,匹配逻辑就会失效,出现漏统计、错统计的问题。
修复方案
推荐使用哈希表分组的实现,不需要依赖订单排序,也能规避引用类型错误,代码如下:
function(error, orders) { if(!error){ let deliveryFee = 0; // 以日期为key存储每日统计数据 const dateGroupMap = {}; for(let order of orders){ const orderDate = moment(order.createdAt).format('YYYY-MM-DD'); // 累加总配送费 deliveryFee += order.deliveryFee; // 对应日期分组不存在则初始化 if(!dateGroupMap[orderDate]){ dateGroupMap[orderDate] = { dateWiseSum: 0, orderCount: 0 }; } // 累加当日统计值 dateGroupMap[orderDate].dateWiseSum += order.deliveryFee; dateGroupMap[orderDate].orderCount += 1; } // 哈希表转成目标结构的数组 const dateWiseData = Object.values(dateGroupMap); // 原有数值格式化逻辑 deliveryFee = (Math.round(deliveryFee * 100) / 100).toFixed(2); let averageShippoAMount = deliveryFee / orders.length; averageShippoAMount = (Math.round(averageShippoAMount * 100) / 100).toFixed(2); let data = { totalShippoAmount: deliveryFee, totalShippoOrders: orders.length, averageShippoAMount: averageShippoAMount, dateWiseData: dateWiseData // 把分组统计结果加入返回值 }; res.send(data); }else{ console.log("something went wrong"); } }
内容的提问来源于stack exchange,提问作者user14222412
相关产品推荐
相关产品推荐

