【问题标题】:How to add data based on particular column in an array using dataweave 2.0如何使用 dataweave 2.0 基于数组中的特定列添加数据
【发布时间】:2021-08-30 03:47:05
【问题描述】:

我有一个特定员工的时间表的 json 有效负载。我想根据 ProjectName 分组并显示时间段。下面是输入和预期输出

输入:

{
    "timeLogs": [
        {
            "projectName": "Project-A",
            "hoursInMins": 480,
            "emailId": "abc@abc.com",
            "workDate": "04-01-2021"
        },
        {
            "projectName": "Project-B",
            "hoursInMins": 480,
            "emailId": "abc@abc.com",
            "workDate": "04-01-2021"            
        },
        {
            "projectName": "Project-C",
            "hoursInMins": 180,
            "emailId": "abc@abc.com",
            "workDate": "04-01-2021"
        },
        {
            "projectName": "Project-A",
            "hoursInMins": 480,
            "emailId": "abc@abc.com",
            "workDate": "04-02-2021"
        },
        {
            "projectName": "Project-B",
            "hoursInMins": 120,
            "emailId": "abc@abc.com",
            "workDate": "04-02-2021"
        },
        {
            "projectName": "Project-C",
            "hoursInMins": 360,
            "emailId": "abc@abc.com",
            "workDate": "04-03-2021"
        }
    ]
}

预期输出:

{
    "Project-A": 16, //in hours
    "Project-B": 10, //in hours
    "Project-C": 9, //in hours
    "emailId": "abc@abc.com",
    "fromDate": "04-01-2021",
    "toDate": "04-03-2021",
    "timesheetName": "(04-01-2021 - 04-03-2021)"
}

提前致谢

【问题讨论】:

标签: dataweave mule4


【解决方案1】:

试试这个:

%dw 2.0
output application/json

var data = {
    "timeLogs": [
        {
            "projectName": "Project-A",
            "hoursInMins": 480,
            "emailId": "abc@abc.com",
            "workDate": "04-01-2021"
        },
        {
            "projectName": "Project-B",
            "hoursInMins": 480,
            "emailId": "abc@abc.com",
            "workDate": "04-01-2021"            
        },
        {
            "projectName": "Project-C",
            "hoursInMins": 180,
            "emailId": "abc@abc.com",
            "workDate": "04-01-2021"
        },
        {
            "projectName": "Project-A",
            "hoursInMins": 480,
            "emailId": "abc@abc.com",
            "workDate": "04-02-2021"
        },
        {
            "projectName": "Project-B",
            "hoursInMins": 120,
            "emailId": "abc@abc.com",
            "workDate": "04-02-2021"
        },
        {
            "projectName": "Project-C",
            "hoursInMins": 360,
            "emailId": "abc@abc.com",
            "workDate": "04-03-2021"
        }
    ]
}



var email = data.timeLogs[0].emailId
var minDate = min(data.timeLogs.*workDate map $ as Date {format: "dd-MM-yyyy"})
var maxDate = max(data.timeLogs.*workDate map $ as Date {format: "dd-MM-yyyy"})

type StringDate = String {format: "dd-MM-yyyy"}
---
(data.timeLogs groupBy $.projectName
mapObject {
    ($$): sum($.hoursInMins) / 60,
     
}) ++ {
    emailId: email,
    fromDate: minDate,
    toDate: maxDate,
    timeSheetName: "($(minDate as StringDate) - $(maxDate as StringDate))"
}

【讨论】:

    【解决方案2】:

    解决方案:

    %dw 2.0
    output application/json
    
    fun sumTime(a: Array)=(a reduce ((item, accumulator=0) -> accumulator + item.hoursInMins )) / 60
    
    var totalHourPerProject = payload.timeLogs groupBy $.projectName 
        mapObject ((value, key, index) -> (key): sumTime(value))
    
    var minMaxDates=payload.timeLogs map $.workDate  as Date {format:"MM-dd-yyyy"} orderBy $
    ---
    {
        (totalHourPerProject),
        emailId: payload.timeLogs[0].emailId,
        fromDate: minMaxDates[0],
        toDate: minMaxDates[-1],
        timesheetName: "(" ++ minMaxDates[0] ++ " - " ++ minMaxDates[-1] ++ ")"
    }
    

    【讨论】:

      【解决方案3】:

      另一种变化:)

      %dw 2.0
      output application/json
      var sortedDate = payload.timeLogs orderBy ((item) -> item.workDate as Date {format:"dd-MM-yyyy"} )
      ---
      payload.timeLogs groupBy ((item) -> item.projectName)
      mapObject ((v, k) -> {
          (k): sum(v map $.hoursInMins)/60
      })
      ++
      {
          emailId: sortedDate[0].emailId,
          fromDate: sortedDate[0].workDate,
          toDate: sortedDate[-1].workDate,
          timesheetName: "($(sortedDate[0].workDate) - $(sortedDate[-1].workDate))"
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多