You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MuleSoft中筛选满足子对象条件的完整对象

MuleSoft DataWeave 筛选Offer对象求助

我是MuleSoft新手,需要从给定的JSON Payload中筛选出完整的Offer对象,要求该对象的characters[].data[]数组中存在"name":"priority"且"value":1的项。以下是相关内容:

JSON Payload

{
  "offers": [
    {
      "id": 100,
      "name": "Test1",
      "category": {
        "characters": [
          {
            "data": [
              {
                "name": "priority",
                "value": 1
              },
              {
                "type": "ILL",
                "result": "pass"
              }
            ]
          }
        ]
      }
    },
    {
      "id": 200,
      "name": "Test2",
      "category": {
        "characters": [
          {
            "data": [
              {
                "name": "priority",
                "value": 2
              },
              {
                "type": "ILL",
                "result": "Fail"
              }
            ]
          }
        ]
      }
    },
    {
      "id": 300,
      "name": "Test3",
      "category": {
        "characters": [
          {
            "data": [
              {
                "name": "priority",
                "value": 3
              },
              {
                "type": "ILL",
                "result": "Pass"
              }
            ]
          }
        ]
      }
    }
  ]
}

预期结果

{
  "id": 100,
  "name": "Test1",
  "category": {
    "characters": [
      {
        "data": [
          {
            "name": "priority",
            "value": 1
          },
          {
            "type": "ILL",
            "result": "pass"
          }
        ]
      }
    ]
  }
}

尝试过的不符合需求的代码

(payload.offers map {
    (($$): $) if((flatten($.category.characters.data) filter ((item, index) -> item.name=="WBB" and item.priority==1)))
}) - {}

解决方案

你的代码存在两处关键错误:一是过滤条件里的item.name=="WBB"应该改为"priority",二是判断优先级值时用了item.priority,但原数据里对应的属性是item.value。另外,用map结合条件的方式不够直接,推荐用filter来筛选数组:

筛选出所有符合条件的Offer(返回数组)

%dw 2.0
output application/json
---
payload.offers filter ((offer) -> 
    flatten(offer.category.characters.data) any ((item) -> 
        item.name == "priority" and item.value == 1
    )
)

仅返回第一个符合条件的Offer(匹配你的预期结果)

%dw 2.0
output application/json
---
(payload.offers filter ((offer) -> 
    flatten(offer.category.characters.data) any ((item) -> 
        item.name == "priority" and item.value == 1
    )
))[0]

代码说明

  1. filter:遍历offers数组,保留满足条件的元素
  2. flatten(offer.category.characters.data):将嵌套的characters.data数组展开成一维数组,方便后续判断
  3. any:检查展开后的数组中是否存在至少一个符合name="priority"且value=1的项,只要存在就保留当前Offer
  4. [0]:如果只需要第一个匹配的对象,在筛选后的数组后加上该索引即可

内容的提问来源于stack exchange,提问作者Krish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:25:24