尝试实现reducer方法转换对象数组时出错

问题描述 投票:0回答:1

希望您在此隔离方面做得很好,我大概有一个半小时的时间试图在此代码中查找我的问题,希望您在此练习中对我有所帮助,我有这个数组,

[
  {
    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"
  }
]

这是我的reduce实现,

结果是上一个对象数组,

    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"
    }
]

请不要像我一般的想法那样在意我想花的那部分,我希望我能自己解决这个问题,但是我不喜欢被卡住,所以我会在等待别人的帮助时继续寻找解决方案帮助我解决我的问题。

谢谢!

javascript arrays data-structures
1个回答
0
投票

您需要添加初始值。检查documentation

这是工作代码

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 = 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);
© www.soinside.com 2019 - 2024. All rights reserved.