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

Terraform 对象列表,如何组合具有两个键且具有相同值的对象,terraform,Terraform,我正在创建一个模块来创建IAM角色。消费者将提供类似的服务 role_cross_account_config = [{ account_ids = ["1111112222222","333332222222"] external_id = "yesss" require_mfa = true },{ account_ids = ["845666666666"

我正在创建一个模块来创建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
 }]
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
 }]
我正在尝试将具有相同值的
external_id
require_mfa
的所有对象合并到一个具有所有
帐户id

所以我应该买这样的东西

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
 }]
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
external_id=null
的对象,这是通过使用for循环和if-else逻辑实现的。我绞尽脑汁想找到解决这个问题的办法,但到目前为止还没有找到任何解决办法

注:

  • require_mfa
    是布尔值
  • external\u id
    是字符串
  • 外部\u id
    可以有任何值。这意味着消费者可以使用自己选择的
    外部\u id
    输入尽可能多的对象。我正在尝试组合任何共享相同值的外部_id和require_mfa的对象

在回答问题之前需要注意的一点是,您的键/值对是作为变量写入的,因此您实际上无法以与对象键/值对相同的方式访问它们。话虽如此,如果您将这些“=”转换为“:”,您可以这样做:

new_list = [{
    account_ids: [],
  external_id: "yesss",
  require_mfa: true
},{
    account_ids: [],
  external_id: "dsaa",
  require_mfa: false
},{
    account_ids: [],
  external_id: null,
  require_mfa: false
}]

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
 }]
 
  for (let i = 0; i < role_cross_account_config.length; i++) {
    if (role_cross_account_config[i]['external_id'] === 'yesss' && role_cross_account_config[i]['require_mfa'] === true) {
    for (let j = 0; j < role_cross_account_config[i]['account_ids'].length; j++) {
        new_list[0]['account_ids'].push(role_cross_account_config[i]['account_ids'][j])      
    }
  }
 }
 
 console.log(new_list)
新列表=[{
帐户ID:[],
外部_id:“是”,
要求(mfa):对
},{
帐户ID:[],
外部_id:“dsaa”,
需要_mfa:错误
},{
帐户ID:[],
外部_id:null,
需要_mfa:错误
}]
角色\u交叉\u帐户\u配置=[{
帐户ID:[“111111222222”,“3333322222222”],
外部_id:“是”,
要求(mfa):对
},{
帐户ID:[“84566666”],
外部_id:“dsaa”,
需要_mfa:错误
},{
帐户ID:[“7777788888”,“666644444”],
外部_id:“dsaa”,
需要_mfa:错误
},{
帐户ID:[“5555644444”],
外部_id:“是”,
要求(mfa):对
},{
帐户ID:[“33333 9999777”],
外部_id:null,
要求(mfa):对
},{
帐户ID:[“6455888888”、“24331551111”、“77788644433”],
外部_id:“是”,
要求(mfa):对
}]
for(设i=0;i

您可以使用else在“if”语句中添加其他组合,如“dsaa”和“false”、“dsaa”和“true”。无论您希望比较什么组合。

现在我更好地了解了您需要什么,我已经为您找到了解决方案。您需要创建一个函数使其工作。我前面提到的相同问题仍然适用,您需要将其设置为带有“:”而不是“=”的真正对象键/值对

基本上,代码遍历对象数组“role_cross…”,并将“external id”和“require_mfa”与数组中的所有其他对象进行比较。如果找到两者的匹配项,则将这些值存储在一个称为“checkedVal”的单独数组中。函数“alreadyChecked”在迭代之前检查“checkedVal”是否已检查组合(例如:yesss和true),如果已检查,则移动到下一个要比较的对象

一旦通过所有检查,它将在“new_list”数组中创建一个新的“object”,并使用预定义的键。这使得向数组中新创建的对象添加适当的值变得非常容易。如果您对任何零件有疑问,请告诉我

我想这应该能帮你解决问题。代码如下:

let new_list = [{}]
let checkedVal = [['init1','init2']]
let nextNewEntry = 0

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
 }]
 
  function alreadyChecked(external, mfa) {
    for (k=0; k < checkedVal.length; k++) {
        
        if (checkedVal[k][0] === external && checkedVal[k][1] === mfa) {
          console.log('Already checked this combination '+external+' '+mfa)
          return true
      } else if (k === checkedVal.length -1) {
            console.log('Have not checked this yet '+external+' '+mfa)
            return false
      }
      
    }
    
  }
  
  for (let i = 0; i < role_cross_account_config.length; i++) {
    if (alreadyChecked(role_cross_account_config[i]['external_id'],role_cross_account_config[i]['require_mfa'])===false) {
    console.log('moving forward with the iterations')
    nextNewEntry++;
    checkedVal[nextNewEntry-1] = []
    checkedVal[nextNewEntry-1].push(role_cross_account_config[i]['external_id'],role_cross_account_config[i]['require_mfa'])
    new_list[nextNewEntry-1] = {
    account_ids: [],
    external_id: '',
    require_mfa: ''
    }   
        for (let j = 0; j < role_cross_account_config.length; j++) {
        
        
            if (role_cross_account_config[i]['external_id'] === role_cross_account_config[j]['external_id'] && role_cross_account_config[i]['require_mfa'] === role_cross_account_config[j]['require_mfa']) {
          
            for (let h = 0; h < role_cross_account_config[j]['account_ids'].length; h++) {
            new_list[nextNewEntry-1]['account_ids'].push(role_cross_account_config[j]['account_ids'][h]);
            new_list[nextNewEntry-1]['external_id'] = role_cross_account_config[i]['external_id'];
            new_list[nextNewEntry-1]['require_mfa'] = role_cross_account_config[i]['require_mfa'];                 
            }           
            }
            
      }
      
    }    
  }
 
 console.log(new_list)
 console.log(checkedVal)
let new_list=[{}]
让checkedVal=[['init1','init2']]
设nextNewEntry=0
角色\u交叉\u帐户\u配置=[{
帐户ID:[“111111222222”,“3333322222222”],
外部_id:“是”,
要求(mfa):对
},{
帐户ID:[“84566666”],
外部_id:“dsaa”,
需要_mfa:错误
},{
帐户ID:[“7777788888”,“666644444”],
外部_id:“dsaa”,
需要_mfa:错误
},{
帐户ID:[“5555644444”],
外部_id:“是”,
要求(mfa):对
},{
帐户ID:[“33333 9999777”],
外部_id:null,
要求(mfa):对
},{
帐户ID:[“6455888888”、“24331551111”、“77788644433”],
外部_id:“是”,
要求(mfa):对
}]
已检查功能(外部,mfa){
对于(k=0;k