簡體   English   中英

如何通過將其與對象數組中另一個字段的索引進行比較來獲取值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM