在 Dataweave 2.0 中如何从平面数组创建嵌套数组 - Mule 4

In Dataweave 2.0 how to create nested array from flat array - Mule 4

我需要使用从不同 API 收到的响应创建一个嵌套数组。我有这个平面阵列,包含所有数据。创建嵌套数组的最佳方法是什么,其中子级根据其结果状态嵌套到其父级。

Input JSON flat array as follows:

  [
   {
    "studentNumber": "FP5500",
    "studentName": "John Doe",
    "Subject": "Arts",
    "grade": "B",
    "result": "Pass"
   },{
    "studentNumber": "FP5501",
    "studentName": "Jane Doe",
    "Subject": "Arts",
    "grade": "B",
    "result": "Pass"
   },{
    "studentNumber": "FP5501",
    "studentName": "Jane Doe",
    "Subject": "Economics",
    "grade": "A",
    "result": "Pass"
   },{
    "studentNumber": "FP5502",
    "studentName": "Bane Doe",
    "Subject": "Arts",
    "result": "Fail"
   }
]

Expecting output as nested array like below format:

[
  {
   "studentNumber": "FP5500",
   "studentName": "John Doe",
   "Status": "Pass",
   "reportDetails": {
     "Subject": "Arts",
     "grade": "B"
    }
  },
  {
   "studentNumber": "FP5501",
   "studentName": "Jane Doe",
   "Status": "Pass",
   "reportDetails": [{
     "Subject": "Arts",
     "grade": "B"
    },
    {
     "Subject": "Economics",
     "grade": "A"
    }]
  } 
]

数组中的第四个元素 (第 3 个学生) 应该被忽略,因为 "result""Fail",但前两名学生应该包含在响应中,应该只有 "StudentName" => Jane Doe 的条目,带有嵌套数组以获取主题详细信息。

我进行了研究,但找不到有效的解决方案(不使用 for 或 foreach 循环)。我尝试使用 mapObject 在重复地图上进行映射和过滤,但没有任何进展。我该如何解决?

一个快速简便的方法如下:

脚本

%dw 2.0
output application/json
---
[payload filter $.result != "Fail" groupBy $.studentNumber   mapObject {
    "studentNumber": $.studentNumber[0],
    "studentName":  $.studentName[0],
    "Subject": $.Subject[0],
    "Status": $.result[0],
    (if (sizeOf($) == 1)
     "reportDetails": ($ map {
        "Subject": $.Subject,
        "Grade": $.grade
    
    })[0]
    else
    "reportDetails": $ map {
        "Subject": $.Subject,
        "Grade": $.grade
    
    })
    
}]

输出

[
  {
    "studentNumber": "FP5500",
    "studentName": "John Doe",
    "Subject": "Arts",
    "Status": "Pass",
    "reportDetails": {
      "Subject": "Arts",
      "Grade": "B"
    },
    "studentNumber": "FP5501",
    "studentName": "Jane Doe",
    "Subject": "Arts",
    "Status": "Pass",
    "reportDetails": [
      {
        "Subject": "Arts",
        "Grade": "B"
      },
      {
        "Subject": "Economics",
        "Grade": "A"
      }
    ]
  }
]

已接受答案的脚本输出似乎与 OP 的预期输出不匹配。不确定为什么接受答案。

这是另一个脚本 -

%dw 2.0
output application/json
---
(payload filter ((student) -> student.result == 'Pass') 
    groupBy ((student) -> student.studentNumber))
        pluck $ 
            reduce (item, accumulator= []) -> 
                accumulator ++ [(item[0] - "grade" - "Subject" - "result") 
                    ++ {Status: item[0].result, resultDetails: item map {Subject: $.Subject, grade: $.grade}}]
        
                

产生 -

[
  {
    "studentNumber": "FP5500",
    "studentName": "John Doe",
    "Status": "Pass",
    "resultDetails": [
      {
        "Subject": "Arts",
        "grade": "B"
      }
    ]
  },
  {
    "studentNumber": "FP5501",
    "studentName": "Jane Doe",
    "Status": "Pass",
    "resultDetails": [
      {
        "Subject": "Arts",
        "grade": "B"
      },
      {
        "Subject": "Economics",
        "grade": "A"
      }
    ]
  }
]