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

Mulesoft DataWeave:用update操作符/函数更新指定JSON对象属性

需求与问题

需求

在给定的JSON数组中,当id="746936"且taskReferenceId="440827"时,将对应JSON对象的isSendStatus属性设为true。

输入数据

var xyz = [
  {
    "referenceId": "WRK-2403472",
    "taskReferenceId": "440827",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test1"
      },
      {
        "id": "746936",
        "isSendStatus": false,
        "message": "test2"
      }
    ]
  },
  {
    "referenceId": "WRK-2403470",
    "taskReferenceId": "440828",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test3"
      }
    ]
  }
]

已实现的Map方法(可行但代码量较大)

xyz map (item,index) -> {
    (referenceId : item.referenceId) if (item.referenceId != null),
    (taskReferenceId: item.taskReferenceId) if (item.taskReferenceId != null),
    (textMessages: item.textMessages map {
        id: $.id,
        isSendStatus: if(($.id == "746936") and (item.taskReferenceId == "440827")) true else  $.isSendStatus,
        message: $.message
    }) if (item.textMessages != null)
}

正确输出结果

[
  {
    "referenceId": "WRK-2403472",
    "taskReferenceId": "440827",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test1"
      },
      {
        "id": "746936",
        "isSendStatus": true,
        "message": "test2"
      }
    ]
  },
  {
    "referenceId": "WRK-2403470",
    "taskReferenceId": "440828",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test3"
      }
    ]
  }
]

尝试的错误写法

写法1

// attempt 1
xyz map ($ update {
    case .textMessages["746936"].isSendStatus -> true
})

写法2

// attempt 2
xyz map(item,index) -> (item update ["textMessages"] with (if ($.id == "746936") 
        {
        id: $.id, 
        isSendStatus: true, 
        message: $.message
        } 
        else 
        $
    )
)

正确的Update操作符实现方式

可以通过嵌套update和map来精准定位并修改目标元素,代码更简洁:

xyz map ($ update {
    case item if item.taskReferenceId == "440827" -> 
        item update {
            case .textMessages -> $ map (msg) -> 
                msg update { case .isSendStatus if msg.id == "746936" -> true }
        }
})

或者更直观的分支判断写法:

xyz map (item) -> 
    if (item.taskReferenceId == "440827") 
        item update {
            case .textMessages -> $ map (msg) -> 
                if (msg.id == "746936") msg update { case .isSendStatus -> true } else msg
        }
    else item

说明

  1. 外层通过map遍历数组对象,先筛选出taskReferenceId匹配的对象
  2. 对匹配的对象,使用update操作符修改其textMessages属性
  3. 内层对textMessages数组用map遍历,仅对id="746936"的元素,通过update将isSendStatus设为true
  4. 不匹配的对象直接原样返回,避免无效修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:23:38