在 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"
}
]
}
]
我需要使用从不同 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"
}
]
}
]