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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:54:03