如何在mule 4中映射数组的某些键以生成另一个

如何在mule 4中映射数组的某些键以生成另一个,mule,dataweave,mule4,Mule,Dataweave,Mule4,我有一个数组- [ { "Number": "12345", "abc": { "group": "abc", "operation": "Create" }, "def": { "gr

我有一个数组-

[
    {
        "Number": "12345",
        "abc": {
            "group": "abc",
            "operation": "Create"
        },
        "def": {
            "group": "def",
            "operation": "Create"
        }
    },
    {
        "Number": "45678",
        "xyz": {
            "group": "xyz",
            "operation": "Update"
        },
        "sdf": {
            "group": "sfd",
            "operation": "Delete"
        }
    }
]
需要转换成这种形式-

[
    {
        "Number": "12345",
        "group": "abc",
        "operation": "Create"
    },
    {
        "Number": "12345",
        "group": "def",
        "operation": "Create"
    },
    {
        "Number": "45678",
        "group": "xyz",
        "operation": "Update"
    },
    {
        "Number": "45678",
        "group": "sfd",
        "operation": "Delete"
    }
]

正在尝试为相同的对象编写dataweave表达式。问题在于abc、def、xyz和all都是对象,它们可能会出现,也可能不会出现,并且可能具有不同的值。

您需要映射每个元素,然后过滤每个对象以消除属性编号,并使用PULLC将剩余的每个关键点转换为数组。我使用flatMap将每次采集的每个结果数组连接到响应中

%dw 2.0
output application/json
---
payload flatMap ((item, index) -> 
    item 
       filterObject ((value, key, index) -> !(key ~= "Number")) 
       pluck ((value, key, index) -> {Number: item.Number, group: value.group, operation: value.operation})
)

另一种处理方法:

%dw 2.0
output application/json
---
payload flatMap ((item, index) -> 
    (item - "Number") pluck {
        "Number": item.Number,
        ($)
    }
)

方法基本相同,但解释如下:我们使用
map
进行迭代,但使用
flatMap
进行迭代,因为我们知道将从每个实例返回多个项目。然后我们要做的第一件事是从项中删除键
Number
,因为我们只想为每个不是
Number
的键构建一个新对象。然后我们可以
抓取
,这样我们就可以访问每个键和值;从这里,我们用
的数字值构建一个新对象,并将整个对象扩展到该对象中。当使用这样的匿名函数时,
$
$$
$$$
等表示函数参数-在
Pull
的大小写值、键、索引中。我们在
$
周围放的括号意味着将整个对象扩展到我们的对象中;在javascript中,这类似于
{…props,另一个键:'value'}
。这意味着我们实际上不需要知道或关心该对象的结构,如果我们有一个潜在的灵活模式,这将非常有用。

Hi-Aled,感谢一个小小的更改,如果我在其中有另一个键,如-[{“Number”:“12345”,“member”:{“abc”:{“group”:“abc”,“operation”:“Create”},“def”:{“group”:“def”,“operation”:“Create”}},{“Number”:“45678”,“member”:{“xyz”:{“group”:“xyz”,“operation”:“Update”},“sdf”:{“group”:“sfd”,“operation”:“Delete”“}}}]并且需要相同的输出,我应该更改什么?%dw 2.0输出应用程序/json---payload flatMap((item,index)->(item filterObject((value,key,index)->!(key~=“Number”))。成员pull((value,key,index)->{Number:item.Number,group:value.group,operation:value.operation})