[英]How to get value by comparing it with index of another field in the array of objects
如果我們要查找的文本是“PQR”,那么我們應該得到相應的子字段值“dataweave”。 在第一個對象中,我們有值,但在第二個對象中丟失了,所以它應該給默認 null。 文本也將不按順序排列。 “ABC”、“BCD”、“PQR”在輸出中是靜態的,即使它可能會出現或不會出現在輸入中。
輸入:
[ {
"data":{
"field": "value"
},
"field1": "ABC",
"subfield01": "test",
"field2": "BCD",
"subfield02": "mule",
"field3": "PQR",
"subfield3": "dataweave"
.
.
.
"field10":"",
"subfield10": ""
},
{
"data":{
"field": "value"
}
"field1": "BCD",
"subfield01": "testing",
"field2": "ABC",
"subfield02": "mulesoft",
"field3": "",
"subfield03": ""
.
.
.
"field10":"",
"subfield10": ""
}
]
預期輸出:
[
{
"SearchFieldABC": "test",
"SearchFieldBCD": "mule",
"SearchFieldPQR": "dataweave",
"fields123": "value",
"fields678": "value2"
},
{
"SearchFieldABC": "mulesoft",
"SearchFieldBCD": "testing",
"SearchFieldPQR": null,
"fields123": "value",
"fields678": "value2"
}
]
雖然以前的答案看起來不錯,但我發布了我的
%dw 2.0
output application/json
var query = ["ABC", "BCD", "PQR"]
---
payload map ((item, index) -> do { //Group by index
var fieldByIndex = item
groupBy ((value, key) -> do {
key as String match {
case f if(f startsWith "field") -> f[5 to -1]
case f if(f startsWith "subfield") -> f[8 to -1]
}
})
---
{
(
query
map ((q, index) -> do {
var fieldSubField = (fieldByIndex
filterObject ((value, key, index) -> value['field$(key)'] == q))[0]
---
{
"SearchField$(q)": valuesOf(
fieldSubField
filterObject ((value, key, index) -> key as String startsWith "subfield"))[0]
}
})
)
}
} )
您可以使用以下數據編織。 我將它分為兩個主要功能,第一個mapFieldsToSubFields
從您的輸入中獲取一個元素,基本上生成一個對象,該對象直接將字段的值映射到它們各自的子字段的值。 因此它將生成以下輸出,例如
{
"ABC": "test",
"BCD": "mule",
"PQR": "dataweave"
}
這將使下一個函數mapToRequiredOutput
更容易將其快速映射到所需格式並從輸入中插入缺失的字段。
%dw 2.0
output application/json
var allFields = payload flatMap entriesOf($)
filter ($.key startsWith "field") and (!isEmpty($.value))
map $.value
distinctBy $
fun mapFieldsToSubFields(object) =
object filterObject ((value, key) -> (key startsWith "field")) // Remove all "subfields"
filterObject !isEmpty($) // Remove empty field values
mapObject ($): object["sub$($$)"] // example: $ = "ABC" and $$ = field1, so object["sub$($$)"] = object[subfield1] = "test"
fun mapToRequiredOutput(object) = {(
allFields map {"SearchField$($)": object[$]}
)}
---
payload
map mapFieldsToSubFields($)
map mapToRequiredOutput($)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.