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

使用DataWeave 2.0过滤含指定参会者的会议对象并新增字段

问题:筛选含特定参会者的会议并新增邮箱字段

输入JSON

{
"context": "context",
"meetings": [
    {
        "id": 123,
        "subject": "subject 123",
        "attendees": [
            {
                "type": "required",
                "emailAddress": {
                    "name": "user1",
                    "address": "user1@gmail.com"
                }
            },
            {
                "type": "required",
                "emailAddress": {
                    "name": "!user2",
                    "address": "user2@gmail.com"
                }
            }
        ]
    },
    {
        "id": 456,
        "subject": "subject 456",
        "attendees": [
            {
                "type": "required",
                "emailAddress": {
                    "name": "user3",
                    "address": "user3@gmail.com"
                }
            },
            {
                "type": "required",
                "emailAddress": {
                    "name": "user4",
                    "address": "user4@gmail.com"
                }
            }
        ]
    }
]
}

需求说明

从上述JSON中筛选出包含名称以!开头的参会者的会议对象,为每个结果对象新增email字段,值为该符合条件的参会者的邮箱地址。预期输出如下:

[
{
"id": 123,
"subject": "subject 123",
"attendees": [
            {
                "type": "required",
                "emailAddress": {
                    "name": "user1",
                    "address": "user1@gmail.com"
                }
            },
            {
                "type": "required",
                "emailAddress": {
                    "name": "!user2",
                    "address": "user2@gmail.com"
                }
            }
        ],
"email" : "user2@gmail.com"
}
]

尝试的代码及错误信息

尝试的DataWeave代码

%dw 2.0
output application/json
---
payload.meetings filter ((item, index) -> item.attendees.emailAddress.name startsWith  "!") map (
{
  "id" : $.id,
  "subject" : $.subject,
  "attendees" : $.attendees,
  "email" : ($.attendees filter $.emailAddress.name startsWith  "!")[0].emailAddress.address
})

错误信息

You called the function 'startsWith' with these arguments: 
  1: Array (["user1", "user2"])
  2: String ("!")

But it expects arguments of these types:
  1: String
  2: String

4| payload.meetings filter ((item, index) -> item.attendees.emailAddress.name startsWith  "!") map (

错误原因:item.attendees.emailAddress.name会提取所有参会者的姓名,返回一个字符串数组,而startsWith函数要求第一个参数是字符串,类型不匹配导致报错。

正确的DataWeave实现

%dw 2.0
output application/json
---
payload.meetings 
    // 筛选出存在符合条件参会者的会议
    filter ((meeting) -> meeting.attendees some ($.emailAddress.name startsWith "!"))
    // 为符合条件的会议新增email字段
    map ((meeting) -> {
        meeting, // 保留原会议的所有字段,无需手动逐个复制
        email: (meeting.attendees filter ($.emailAddress.name startsWith "!"))[0].emailAddress.address
    })

代码说明

  1. 筛选逻辑:用some操作符检查attendees数组中是否至少有一个元素满足name以!开头的条件,some专门用于数组的存在性判断,避免返回数组给startsWith函数。
  2. 映射逻辑:
    • meeting, 会直接展开原会议对象的所有属性(id、subject、attendees等),简化代码编写。
    • 过滤出当前会议中符合条件的参会者,取第一个的邮箱地址作为email字段的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:23:19