使用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 })
代码说明
- 筛选逻辑:用
some操作符检查attendees数组中是否至少有一个元素满足name以!开头的条件,some专门用于数组的存在性判断,避免返回数组给startsWith函数。 - 映射逻辑:
meeting,会直接展开原会议对象的所有属性(id、subject、attendees等),简化代码编写。- 过滤出当前会议中符合条件的参会者,取第一个的邮箱地址作为
email字段的值。
内容的提问来源于stack exchange,提问作者user3286888
相关产品推荐
相关产品推荐

