对象列表,如何组合具有两个键具有相同值的对象

2024-02-12

我正在创建一个用于创建 IAM 角色的模块。消费者将提供这样的东西

role_cross_account_config = [{
     account_ids     = ["1111112222222","333332222222"]
     external_id = "yesss"
     require_mfa = true
 },{
     account_ids     = ["845666666666"]
     external_id = "dsaa"
     require_mfa = false
 },{
     account_ids     = ["7777788888888","6666444444444"]
     external_id = "dsaa"
     require_mfa = false
 },{
     account_ids     = ["555564444444"]
     external_id = "yesss"
     require_mfa = true
 },{
     account_ids     = ["3333399997777"]
     external_id = null
     require_mfa = true
 },{
     account_ids     = ["64558888888","24331551111","77788644433"]
     external_id = "yesss"
     require_mfa = true
 }]

我正在尝试合并具有相同值的所有对象external_id and require_mfa与所有物体合而为一account_ids

所以我应该得到这样的东西

new_list = [{
     account_ids     = ["1111112222222","333332222222","555564444444","64558888888","24331551111","77788644433"]
     external_id = "yesss"
     require_mfa = true
 },{
     account_ids     = ["845666666666","7777788888888","6666444444444"]
     external_id = "dsaa"
     require_mfa = false
 },{
     account_ids     = ["3333399997777"]
     external_id = null
     require_mfa = true
 }]

我能够做到这一点,但仅限于那些具有相同价值观的人require_mfa and external_id = null这是通过使用 for 循环和 if else 逻辑。我绞尽脑汁寻找解决办法,但到目前为止无法想出任何解决方案

NOTE:

  • require_mfa是布尔值
  • external_id是字符串
  • The external_id可以有任何价值。这意味着消费者可以用任何东西输入尽可能多的物体external_id他们选择。我正在尝试将外部 id 和 require mfa 共享相同值的任何对象组合起来。

实际上,我能够找到解决方案,并且我会将其发布,以便有一天它可能会使某人受益。

首先,我必须更改模块,以便它为每个模块获取一个对象account_id而不是有一个列表account_ids在每一个物体中。像这样:

role_cross_account_config = [{
     account_ids     = "333332222222"
     external_id = "yesss"
     require_mfa = true
 },{
     account_ids     = "333332222222"
     external_id = "yesss"
     require_mfa = true
 },{
     account_ids     = "845666666666"
     external_id = "dsaa"
     require_mfa = false
 },{
     account_ids     = "7777788888888"
     external_id = "dsaa"
     require_mfa = false
 },{
     account_ids     = "6666444444444"
     external_id = "dsaa"
     require_mfa = false
 },{
     account_ids     = "555564444444"
     external_id = "yesss"
     require_mfa = true
 },{
     account_ids     = "3333399997777"
     external_id = null
     require_mfa = true
 },{
     account_ids     = "64558888888"
     external_id = "yesss"
     require_mfa = true
 },{
     account_ids     = "24331551111"
     external_id = "yesss"
     require_mfa = true
 },{
     account_ids     = "77788644433"
     external_id = "yesss"
     require_mfa = true
 }]

我用局部变量来解决这个问题。因为我试图按两个条件进行分组,并且其中一个条件是布尔值,所以如果我将列表分为两个不同的列表,一个用于布尔值 true,一个用于布尔值 false。然后我处理每个列表并使用第二个条件进行分组"for"随着"if"。我必须使用不同的,因为我的方式会导致许多重复。

NOTE:这种方法在任何编程语言中都会被认为是垃圾,因为它浪费时间和资源,但这是我在 Terraform 中找到的唯一方法,因为它仍然是一种非常有限的语言。我相信这样的事情在不久的将来会变得容易得多,因为 Terraform 仍在成长和发展。

locals {
  list_no_mfa = [for s in var.role_cross_account_config : 
          {
            external_id = s.external_id
            require_mfa = s.require_mfa
            account_ids = s.account_ids
          }
        if s.require_mfa != true]

  no_mfa_same_id = distinct([for s in local.list_no_mfa : 
          {
            external_id = s.external_id
            require_mfa = s.require_mfa
            account_ids = [for i in local.list_no_mfa : i.account_ids if i.external_id == s.external_id]
          }
        ])

  list_mfa = [for s in var.role_cross_account_config : 
          {
            external_id = s.external_id
            require_mfa = s.require_mfa
            account_ids = s.account_ids
          }
        if s.require_mfa != false]

  mfa_same_id = distinct([for s in local.list_mfa : 
          {
            external_id = s.external_id
            require_mfa = s.require_mfa
            account_ids = [for i in local.list_mfa : i.account_ids if i.external_id == s.external_id]
          }
        ])

  combined_list = concat(local.no_mfa_same_id, local.mfa_same_id)
}

Now the local.combined_list是希望的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象列表,如何组合具有两个键具有相同值的对象 的相关文章

随机推荐