Azure 逻辑应用程序根据条件从两个数组集合中形成一个新数组
Azure Logic Apps form a new array from two array collections based on a condition
我有两个数组集合如下
"**entitiy1**": [
{
"lotNumber": "Lot04",
"itemId": "1000123",
"locationId": "65668"
},
{
"lotNumber": "Lot02",
"itemId": "1000123"
"locationId": "1000006"
}]
"**entitiy2**":[
{
"storageLocationId": "1000006",
"storageLocationName": "Back Cooler"
},
{
"storageLocationId": "1000007",
"storageLocationName": "Stock Room"
}]
最终的新数组应该是通过使用locationId和storageLocationId匹配数据形成的
[{
"lotNumber": "Lot02",
"itemId": "1000123"
"locationId": "1000006",
"storageLocationName":"Back Cooler"
}]
我正在尝试如下。我正在遍历一个数组并使用当前项目匹配条件过滤第二个数组。
但是每次循环总是显示失败。它显示为上一个和下一个迭代链接。当我们滚动到下一次迭代时,它显示匹配项已通过。但我只需要匹配的输出
第3行有匹配的记录
如何将所有匹配记录组成最终数组?
"For_each": {
"actions": {
"Append_to_array_variable": {
"inputs": {
"name": "finalArray",
"value": "@outputs('Compose')"
},
"runAfter": {
"Compose": [
"Succeeded"
]
},
"type": "AppendToArrayVariable"
},
"Compose": {
"inputs": {
"itemCount": "@items('For_each')?['itemCount']",
"locationId": "@items('For_each')?['locationId']",
"locationName": "@body('Filter_array')?[0]['storageLocationName']",
"lotNumber": "@items('For_each')?['lotNumber']",
"sellByDate": "@items('For_each')?['sellByDate']"
},
"runAfter": {
"Filter_array": [
"Succeeded"
]
},
"type": "Compose"
},
"Filter_array": {
"inputs": {
"from": "@body('Select_ESO_Locations')",
"where": "@equals(string(item()['storageLocationId']), string(items('For_each')['locationId']))"
},
"runAfter": {},
"type": "Query"
}
},
"foreach": "@body('Select_LSO_Locations')",
"runAfter": {
"Initialize_variable": [
"Succeeded"
]
},
"type": "Foreach"
}
您的撰写操作失败,因为您正尝试使用硬编码索引 [0] 从过滤后的数组中读取数据。只需将您读取值的方式更改为
在 Compose 中的每个内部
代替
"locationName": "@body('Filter_array')?[0]['storageLocationName']",
做
"locationName": "@body('Filter_array')?[0]?['storageLocationName']",
您修改后的 For Each 应如下所示
"For_each": {
"actions": {
"Append_to_array_variable": {
"inputs": {
"name": "finalArray",
"value": "@outputs('Compose')"
},
"runAfter": {
"Compose": [
"Succeeded"
]
},
"type": "AppendToArrayVariable"
},
"Compose": {
"inputs": {
"itemCount": "@items('For_each')?['itemCount']",
"locationId": "@items('For_each')?['locationId']",
"locationName": "@body('Filter_array')?[0]?['storageLocationName']",
"lotNumber": "@items('For_each')?['lotNumber']",
"sellByDate": "@items('For_each')?['sellByDate']"
},
"runAfter": {
"Filter_array": [
"Succeeded"
]
},
"type": "Compose"
},
"Filter_array": {
"inputs": {
"from": "@body('Select_ESO_Locations')",
"where": "@equals(string(item()['storageLocationId']), string(items('For_each')['locationId']))"
},
"runAfter": {},
"type": "Query"
}
},
"foreach": "@body('Select_LSO_Locations')",
"runAfter": {
"Initialize_variable": [
"Succeeded"
]
},
"type": "Foreach"
}
PS
话虽这么说,也请考虑以下选项
1) 使用液体变换将 json 变换为 json。通过编写液体变换,您可以更好地控制变换。请注意,这需要一个集成帐户,如果您在企业中使用它,我强烈建议您使用此路径
2) 使用 Azure 函数进行转换
我有两个数组集合如下
"**entitiy1**": [
{
"lotNumber": "Lot04",
"itemId": "1000123",
"locationId": "65668"
},
{
"lotNumber": "Lot02",
"itemId": "1000123"
"locationId": "1000006"
}]
"**entitiy2**":[
{
"storageLocationId": "1000006",
"storageLocationName": "Back Cooler"
},
{
"storageLocationId": "1000007",
"storageLocationName": "Stock Room"
}]
最终的新数组应该是通过使用locationId和storageLocationId匹配数据形成的
[{
"lotNumber": "Lot02",
"itemId": "1000123"
"locationId": "1000006",
"storageLocationName":"Back Cooler"
}]
我正在尝试如下。我正在遍历一个数组并使用当前项目匹配条件过滤第二个数组。 但是每次循环总是显示失败。它显示为上一个和下一个迭代链接。当我们滚动到下一次迭代时,它显示匹配项已通过。但我只需要匹配的输出
第3行有匹配的记录
如何将所有匹配记录组成最终数组?
"For_each": {
"actions": {
"Append_to_array_variable": {
"inputs": {
"name": "finalArray",
"value": "@outputs('Compose')"
},
"runAfter": {
"Compose": [
"Succeeded"
]
},
"type": "AppendToArrayVariable"
},
"Compose": {
"inputs": {
"itemCount": "@items('For_each')?['itemCount']",
"locationId": "@items('For_each')?['locationId']",
"locationName": "@body('Filter_array')?[0]['storageLocationName']",
"lotNumber": "@items('For_each')?['lotNumber']",
"sellByDate": "@items('For_each')?['sellByDate']"
},
"runAfter": {
"Filter_array": [
"Succeeded"
]
},
"type": "Compose"
},
"Filter_array": {
"inputs": {
"from": "@body('Select_ESO_Locations')",
"where": "@equals(string(item()['storageLocationId']), string(items('For_each')['locationId']))"
},
"runAfter": {},
"type": "Query"
}
},
"foreach": "@body('Select_LSO_Locations')",
"runAfter": {
"Initialize_variable": [
"Succeeded"
]
},
"type": "Foreach"
}
您的撰写操作失败,因为您正尝试使用硬编码索引 [0] 从过滤后的数组中读取数据。只需将您读取值的方式更改为 在 Compose 中的每个内部 代替
"locationName": "@body('Filter_array')?[0]['storageLocationName']",
做
"locationName": "@body('Filter_array')?[0]?['storageLocationName']",
您修改后的 For Each 应如下所示
"For_each": {
"actions": {
"Append_to_array_variable": {
"inputs": {
"name": "finalArray",
"value": "@outputs('Compose')"
},
"runAfter": {
"Compose": [
"Succeeded"
]
},
"type": "AppendToArrayVariable"
},
"Compose": {
"inputs": {
"itemCount": "@items('For_each')?['itemCount']",
"locationId": "@items('For_each')?['locationId']",
"locationName": "@body('Filter_array')?[0]?['storageLocationName']",
"lotNumber": "@items('For_each')?['lotNumber']",
"sellByDate": "@items('For_each')?['sellByDate']"
},
"runAfter": {
"Filter_array": [
"Succeeded"
]
},
"type": "Compose"
},
"Filter_array": {
"inputs": {
"from": "@body('Select_ESO_Locations')",
"where": "@equals(string(item()['storageLocationId']), string(items('For_each')['locationId']))"
},
"runAfter": {},
"type": "Query"
}
},
"foreach": "@body('Select_LSO_Locations')",
"runAfter": {
"Initialize_variable": [
"Succeeded"
]
},
"type": "Foreach"
}
PS 话虽这么说,也请考虑以下选项 1) 使用液体变换将 json 变换为 json。通过编写液体变换,您可以更好地控制变换。请注意,这需要一个集成帐户,如果您在企业中使用它,我强烈建议您使用此路径 2) 使用 Azure 函数进行转换