Azure Bicep如何从对象数组提取并合并嵌套peers数组
Bicep提取合并嵌套peers数组并关联vnetid的解决方案
要实现从vnets数组中提取所有嵌套的peers数组,同时为每个peer对象添加所属vnet的vnetid,可以通过Bicep的map和flatten函数组合实现,具体代码如下:
param vnets array = [ { vnetid: 0 name: '0-test-test' addressPrefix: '10.10.74.0/22' peers: [ { name: '0-to-1' peerToId: 1 } ] subnets: [ { name: 'GatewaySubnet' addressPrefix: '10.10.74.0/25' } { name: 'AzureFirewallSubnet' addressPrefix: '10.10.74.128/25' } ] } { vnetid: 1 name: '1-test-test' addressPrefix: '10.10.68.0/22' peers: [ { name: '1-to-0' peerToId: 0 } ] subnets: [ { name: 'subnet1' addressPrefix: '10.10.68.0/25' } { name: 'subnet2' addressPrefix: '10.10.69.0/24' } ] } ] // 处理生成目标peers数组 var processedPeers = flatten( map(vnets, (vnet) => { return map(vnet.peers, (peer) => { // 将当前vnet的vnetid合并到peer对象中 return union(peer, { vnetid: vnet.vnetid }) }) }) ) // 输出结果验证(可选) output peers array = processedPeers
代码说明
- 外层map遍历vnets数组:逐个处理每个vnet对象
- 内层map遍历当前vnet的peers数组:通过
union函数将当前vnet的vnetid合并到每个peer对象中 - flatten扁平化数组:将内层map生成的二维数组转换为一维数组,得到最终合并后的peers列表
执行后,processedPeers的结构将完全符合期望格式:
[ { vnetid: 0 name: '0-to-1' peerToId: 1 } { vnetid: 1 name: '1-to-0' peerToId: 0 } ]
为什么concat/union单独无法实现
concat仅能合并多个数组,但无法为每个peer对象添加关联的vnetid属性union用于合并对象属性,不具备数组遍历和扁平化能力,需要和map、flatten配合完成复杂的数组转换
内容的提问来源于stack exchange,提问作者nelo
相关产品推荐
相关产品推荐

