首页 > 解决方案 > 尝试实现转换对象数组的 reducer 方法时出错

问题描述

希望你在这次隔离中做得很好,我花了一个半小时试图在这段代码中寻找我的问题,我希望你在这个练习中帮助我,我有这个数组,

[
  {
    id: "5eb2d53443ba03249056a126",
    creationDate: "2020-05-05",
    percentage: "3.62%",
    quantity: 21,
    requestType: "1-Cash Advance",
    timePercentage: "0:23:27",
    totalCalls: 580,
    totalTime: "8:21;00"
  },
  {
    id: "5eb2d53443ba03249056a127",
    creationDate: "2020-05-05",
    percentage: "57.41%",
    quantity: 333,
    requestType: "2-Info Request",
    timePercentage: "0:47:18",
    totalCalls: 580,
    totalTime: "262:49;00"
  },
    {
    id: "5eb2d53443ba03249056a126",
    creationDate: "2020-05-06",
    percentage: "3.62%",
    quantity: 21,
    requestType: "1-Cash Advance",
    timePercentage: "0:23:27",
    totalCalls: 580,
    totalTime: "8:21;00"
  },
  {
    id: "5eb2d53443ba03249056a127",
    creationDate: "2020-05-06",
    percentage: "57.41%",
    quantity: 333,
    requestType: "2-Info Request",
    timePercentage: "0:47:18",
    totalCalls: 580,
    totalTime: "262:49;00"
  }
]

这是我的减少实现,

结果是前一个对象数组,

    result = Object.values(
        result.reduce((object, {creationDate,
            requestType, quantity,
            totalTime, timePercentage,
            percentage, totalCalls
        }) => {

            if(!object[requestType]) object[requestType] = {
                requestType, quantity, totalTime,
                timePercentage, percentage, totalCalls
            };

            if(object[requestType].requestType === requestType){
                object[requestType].quantity += quantity;
                if(object[requestType].creationDate !== creationDate) object[requestType].totalCalls += totalCalls;
            }
            return object;
        })
    )

我期待的是这个

[
    {
        percentage: "3.62%",
        quantity: 42,
        requestType: "1-Cash Advance",
        timePercentage: "0:46:54",
        totalCalls: 1160,
        totalTime: "16:42;00"
    },
    {
        percentage: "57.41%",
        quantity: 666,
        requestType: "2-Info Request",
        timePercentage: "01:33:48",
        totalCalls: 1160,
        totalTime: "525:38:00"
    }
]

请不要关心我只想要一个一般想法的花哨部分,我希望我可以自己解决这个问题,但我不喜欢被卡住,所以我会在等待有人帮助我的同时继续努力寻找解决方案我的问题。

谢谢!

标签: javascriptarraysdata-structures

解决方案


您需要添加初始值。检查文档

初始值 可选

用作回调第一次调用的第一个参数的值。如果未提供初始值,则数组中的第一个元素将用作初始累加器值并作为 currentValue 跳过。

这是工作代码

let result = [{
        id: "5eb2d53443ba03249056a126",
        creationDate: "2020-05-05",
        percentage: "3.62%",
        quantity: 21,
        requestType: "1-Cash Advance",
        timePercentage: "0:23:27",
        totalCalls: 580,
        totalTime: "8:21;00"
    },
    {
        id: "5eb2d53443ba03249056a127",
        creationDate: "2020-05-05",
        percentage: "57.41%",
        quantity: 333,
        requestType: "2-Info Request",
        timePercentage: "0:47:18",
        totalCalls: 580,
        totalTime: "262:49;00"
    },
    {
        id: "5eb2d53443ba03249056a126",
        creationDate: "2020-05-06",
        percentage: "3.62%",
        quantity: 21,
        requestType: "1-Cash Advance",
        timePercentage: "0:23:27",
        totalCalls: 580,
        totalTime: "8:21;00"
    },
    {
        id: "5eb2d53443ba03249056a127",
        creationDate: "2020-05-06",
        percentage: "57.41%",
        quantity: 333,
        requestType: "2-Info Request",
        timePercentage: "0:47:18",
        totalCalls: 580,
        totalTime: "262:49;00"
    }
];

let aggregatedObject = [];

result = Object.values(result.reduce((aggregatedObject, {
    creationDate,
    requestType,
    quantity,
    totalTime,
    timePercentage,
    percentage,
    totalCalls
}) => {

    if (!aggregatedObject[requestType]) {
        aggregatedObject[requestType] = {
            requestType,
            quantity,
            totalTime,
            timePercentage,
            percentage,
            totalCalls
        };
    }

    if (aggregatedObject[requestType].requestType === requestType) {
        aggregatedObject[requestType].quantity += quantity;
        if (aggregatedObject[requestType].creationDate !== creationDate) {
            aggregatedObject[requestType].totalCalls += totalCalls;
        }
    }
    return aggregatedObject;
}, aggregatedObject));

console.log(result);

推荐阅读