根据 mule Dataweave 中另一个列表的值有效地替换列表中的值
Efficiently replacing values in a list based on value from another list in mule Dataweave
需要一个有效的解决方案来用数组 2 中的值替换数组 1(主列表)中的值。当前代码适用于 Dataweave。但是当两个列表包含更多值时,我认为这不是最佳解决方案。建议使用数组 2 中的值更新数组 1 的最佳解决方案。我使用的是 Mule 3.8.5。我想要一个解决方案,以便我只需要在第二个列表中迭代一次并替换主列表中的所有值。目前,过滤条件在示例中使用了两次。但是在实际场景中,我需要替换8个这样的值。
%dw 1.0
%output application/java
%var arr1 =[
{
"leadId": 127,
"playerId": 334353,
"name": "Joseph",
"activity": "10/03/2015"
},
{
"leadId": 128,
"playerId": 334354,
"name": "Sam",
"activity": "10/03/2017"
},
{
"leadId": 124,
"playerId": "",
"name": "",
"activity": "10/03/2015"
},
{
"leadId": 123,
"playerId": "",
"name": "",
"activity": "10/03/2015"
}
]
%var arr2 = [
{
"playerId": 123456,
"name": "James",
"leadId": 124
},
{
"playerId": 7890,
"name": "Jacob",
"leadId": 123
}
]
---
arr1 map ((actData) -> {
"leadId":actData.leadId,
"playerId": (arr2 filter ($.leadId == actData.leadId))[0].playerId default actData.playerId,
"name": (arr2 filter ($.leadId == actData.leadId))[0].name default actData.name,
"activity": actData.activity
})
以上代码给出了预期的结果。但是当列表值比较多的时候就很慢了。
您好,您应该使用 groupBy,这样它就可以按条件进行索引,然后每次都进行查找而不是筛选
%dw 1.0
%output application/json
%var arr1 =[
{
"leadId": 127,
"playerId": 334353,
"name": "Joseph",
"activity": "10/03/2015"
},
{
"leadId": 128,
"playerId": 334354,
"name": "Sam",
"activity": "10/03/2017"
},
{
"leadId": 124,
"playerId": "",
"name": "",
"activity": "10/03/2015"
},
{
"leadId": 123,
"playerId": "",
"name": "",
"activity": "10/03/2015"
}
]
%var arr2 = [
{
"playerId": 123456,
"name": "James",
"leadId": 124
},
{
"playerId": 7890,
"name": "Jacob",
"leadId": 123
}
]
%var arr2ByLeadId = arr2 groupBy $.leadId
---
arr1 map ((actData) -> {
"leadId":actData.leadId,
"playerId": arr2ByLeadId."$(actData.leadId)"[0].playerId default actData.playerId,
"name": arr2ByLeadId."$(actData.leadId)"[0].name default actData.name,
"activity": actData.activity
})
需要一个有效的解决方案来用数组 2 中的值替换数组 1(主列表)中的值。当前代码适用于 Dataweave。但是当两个列表包含更多值时,我认为这不是最佳解决方案。建议使用数组 2 中的值更新数组 1 的最佳解决方案。我使用的是 Mule 3.8.5。我想要一个解决方案,以便我只需要在第二个列表中迭代一次并替换主列表中的所有值。目前,过滤条件在示例中使用了两次。但是在实际场景中,我需要替换8个这样的值。
%dw 1.0
%output application/java
%var arr1 =[
{
"leadId": 127,
"playerId": 334353,
"name": "Joseph",
"activity": "10/03/2015"
},
{
"leadId": 128,
"playerId": 334354,
"name": "Sam",
"activity": "10/03/2017"
},
{
"leadId": 124,
"playerId": "",
"name": "",
"activity": "10/03/2015"
},
{
"leadId": 123,
"playerId": "",
"name": "",
"activity": "10/03/2015"
}
]
%var arr2 = [
{
"playerId": 123456,
"name": "James",
"leadId": 124
},
{
"playerId": 7890,
"name": "Jacob",
"leadId": 123
}
]
---
arr1 map ((actData) -> {
"leadId":actData.leadId,
"playerId": (arr2 filter ($.leadId == actData.leadId))[0].playerId default actData.playerId,
"name": (arr2 filter ($.leadId == actData.leadId))[0].name default actData.name,
"activity": actData.activity
})
以上代码给出了预期的结果。但是当列表值比较多的时候就很慢了。
您好,您应该使用 groupBy,这样它就可以按条件进行索引,然后每次都进行查找而不是筛选
%dw 1.0
%output application/json
%var arr1 =[
{
"leadId": 127,
"playerId": 334353,
"name": "Joseph",
"activity": "10/03/2015"
},
{
"leadId": 128,
"playerId": 334354,
"name": "Sam",
"activity": "10/03/2017"
},
{
"leadId": 124,
"playerId": "",
"name": "",
"activity": "10/03/2015"
},
{
"leadId": 123,
"playerId": "",
"name": "",
"activity": "10/03/2015"
}
]
%var arr2 = [
{
"playerId": 123456,
"name": "James",
"leadId": 124
},
{
"playerId": 7890,
"name": "Jacob",
"leadId": 123
}
]
%var arr2ByLeadId = arr2 groupBy $.leadId
---
arr1 map ((actData) -> {
"leadId":actData.leadId,
"playerId": arr2ByLeadId."$(actData.leadId)"[0].playerId default actData.playerId,
"name": arr2ByLeadId."$(actData.leadId)"[0].name default actData.name,
"activity": actData.activity
})