如何使用 dataweave 2.0 聚合特定列的数据

How to aggregate data with particular column using dataweave 2.0

我有一个包含项目的有效负载和特定员工的工时详细信息。我想写一个数据编织来合并基于项目的小时数。由于 no.of 小时格式不是数字并且具有不同的格式(例如 02:00),因此我无法汇总小时数。 输入:

{
    "response": {
        "result": [
            {
                "jobName": "Project1",
                "hours": "08:00"
            },
            {
                "jobName": "Project1",
                "hours": "08:00"
            },
            {
                "jobName": "Project1",
                "hours": "03:00"
            },
            {
                "jobName": "Project2",
                "hours": "08:00"
            },
            {
                "jobName": "Project2",
                "hours": "02:00"
            },
            {
                "jobName": "Project3",
                "hours": "06:00"
            }
        ]
    }
}

预期输出:

 {
        "Project1" : "19:00",
        "Project2" : "10:00",
        "Project3" : "06:00"
    }

提前致谢

分解问题。您需要将字符串转换为数字;在这种情况下,最简单的数字就是总分钟数。然后你需要把它们全部加起来……最后把它们转换回来,但是减去 60,失去余数,然后做一个模数。请记住将数字格式化为字符串,以便我们得到 0 填充。

%dw 2.0
import sumBy from dw::core::Arrays
output application/json

fun hoursToMinutes(hours: String) : Number =
    (hours[0 to 1] as Number * 60) + (hours[3 to 4] as Number)

fun minutesToHours(minutes: Number) : String = 
    "$(floor(minutes / 60) as String { format: "00" }):$((minutes mod 60) as String {format: "00"})"

fun sumHours(hours) : Number = 
    hours sumBy hoursToMinutes($.hours)
---
payload.response.result 
    groupBy $.jobName 
    mapObject ($$): minutesToHours(sumHours($))

编辑:将 sumHours 更改为 hours sumBy hoursToMinutes($.hours) 以提高可读性; sumBy 也在做 reduce 所以除了可读性之外没有任何收获。