如何在多个键值对中查找值

问题描述 投票:0回答:1

我有一个对象数组,其中包含创建后的产品 ID 和产品名称,但该数组可能包含未成功创建的产品,并且它返回创建具有失败属性的产品之前的原始负载:

[
   {
      "product_name":"",
      "product_id":"1"
   },
   {
      "product_name":"",
      "product_id":"2"
   },
   {
      "failed_products":[
         {
            "product_id":"3",
            "attribute_1":"Error in value: attribute_1",
            "attribute_2":""
         },
         {
            "product_id":"4",
            "attribute_1":"Error in value: attribute_1",
            "attribute_2":"Error in value: attribute_2"
         }
      ]
   }
]


我必须返回成功产品的对象数组以及失败的产品,并给出它们在名为“错误”的属性上失败的原因:

预期输出:

[
   {
      "product_name":"",
      "product_id":"1",
      "error":""
   },
   {
      "product_name":"",
      "product_id":"2",
      "error":""
   },
   {
      "product_name":"",
      "product_id":"3",
      "error":"Error in value: attribute_1"
   },
   {
      "product_name":"",
      "product_id":"2",
      "error":"Error in value: attribute_1 and Error in value: attribute_2"
   }
]
  • 错误消息可能存在于多个属性中

如何构建最终响应?

mule dataweave mulesoft mule4 anypoint-studio
1个回答
0
投票

将问题分解成各个部分。首先分别处理失败和未失败的属性。然后映射每个元素以添加或修改其属性以匹配预期输出。假设失败产品中除product_id之外的所有属性都是错误属性(您可以使用filterObject()代替),我们只需获取它们的值列表并将它们连接起来。

%dw 2.0
output application/json
---
payload 
    filter !(namesOf($) contains "failed_products") 
    map ($ ++ {error:""})
++
(payload
    filter (namesOf($) contains "failed_products") 
    flatMap (
        $.failed_products map((item) -> { 
            product_name: "",
            product_id: item.product_id,
            error: valuesOf(item - "product_id") filter !(isEmpty($)) joinBy " and "

        })
       
    )
)

输出:

[
  {
    "product_name": "",
    "product_id": "1",
    "error": ""
  },
  {
    "product_name": "",
    "product_id": "2",
    "error": ""
  },
  {
    "product_name": "",
    "product_id": "3",
    "error": "Error in value: attribute_1"
  },
  {
    "product_name": "",
    "product_id": "4",
    "error": "Error in value: attribute_1 and Error in value: attribute_2"
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.