【问题标题】:Combining arrays of objects组合对象数组
【发布时间】:2019-04-05 23:33:44
【问题描述】:

我有两个对象数组。如何将它们组合/连接到一个对象数组中。

我尝试过使用 concat 函数以及遍历 arr2 并将它们推送到 arr1,但我想以更短的方式来代替。

let arr1 = [{
  _id: 1,
  external_id: '74341f74-9c79-49d5-9611-87ef9b6eb75f',
  name: 'Francisca Rasmussen',
  alias: 'Miss Coffey'
 },
  { _id: 19,
    external_id: '68e35e26-7b1f-46ec-a9e5-3edcbcf2aeb9',
    name: 'Francis Rodrigüez',
    alias: 'Mr Lea'
  },
  { _id: 23,
    external_id: 'e9db9277-af4a-4ca6-99e0-291c8a97623e',
    name: 'Francis Bailey',
    alias: 'Miss Singleton'
  }];

let arr2 =   [ { organizations: 'Multron', joining_key: 1 },
  { organizations: 'Bitrex', joining_key: 19 },
  { organizations: 'Enthaze', joining_key: 23 },
  { tickets: 'A Nuisance in Kiribati', joining_key: 1 },
  { tickets: 'A Nuisance in Saint Lucia', joining_key: 19 }
  { tickets: 'A Nuisance in Saint Kilda', joining_key: 19 }
  ]

我想根据 arr1 上的 _id 字段的 join_key 来连接它们,结果如下所示:

   [{
  _id: 1,
  external_id: '74341f74-9c79-49d5-9611-87ef9b6eb75f',
  name: 'Francisca Rasmussen',
  alias: 'Miss Coffey',
  organizations: 'Multron',
  tickets: 'A Nuisance in Kiribati', joining_key: 1
},
  { _id: 19,
    external_id: '68e35e26-7b1f-46ec-a9e5-3edcbcf2aeb9',
    name: 'Francis Rodrigüez',
    alias: 'Mr Lea',
    organizations: 'Bitrex',
    tickets: 'A Nuisance in Saint Lucia',
    tickets: 'A Nuisance in Saint Kilda'
  },
  { _id: 23,
    external_id: 'e9db9277-af4a-4ca6-99e0-291c8a97623e',
    name: 'Francis Bailey',
    alias: 'Miss Singleton',
    organizations: 'Enthaze'
  }]

【问题讨论】:

  • 如果数组包含额外的对象会怎样?
  • 非常不清楚为什么arr1 是一个数组而不是单个对象,如果数组有另一个对象会发生什么。
  • @Amy 如果 arr2 包含任何其他对象,它们都将合并到 arr1。例如:如果 arr2 包含ticket_3,则结果对象中也将包含ticket_3
  • @MarkMeyer 啊,我现在明白了。我在精神上将它们结合在一起。
  • @shadoe2020 OP 没有尝试连接两个数组。你的答案不正确。

标签: javascript ecmascript-6


【解决方案1】:

您可以在这种情况下使用Object.assign(...arr1)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntaxhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax上获得更多关于Spread Operator的参考

let arr1 = [{ _id: 1,
    external_id: '74341f74-9c79-49d5-9611-87ef9b6eb75f',
    name: 'Francisca Rasmussen',
    alias: 'Miss Coffey',
    created_at: '2016-04-15T05:19:46 -10:00'
}];

let arr2 = [ { organizations: 'Multron' },
  { tickets_1: 'A Nuisance in Kiribati' },
  { tickets_2: 'A Nuisance in Saint Lucia' }
  ];
  
  
  arr1 = arr1.concat(arr2)
  //console.log(arr1)
  let result = [Object.assign(...arr1)]
  console.log(result)

【讨论】:

    【解决方案2】:

    有了编辑,这是一个非常不同的问题。您的数组有 _id 要用于查找项目的属性。 arr1 应该是一个对象,这样可以在不搜索整个列表的情况下找到给定 id 的特定项目。事实上,最好创建一个可用于合并对象的查找对象(尽管您可以在数组上使用find()

    然后只需单步执行arr2 并将对象添加到来自arr1 的正确项目:

    let arr1 = [{_id: 1,external_id: '74341f74-9c79-49d5-9611-87ef9b6eb75f',name: 'Francisca Rasmussen',alias: 'Miss Coffey'},{ _id: 19,external_id: '68e35e26-7b1f-46ec-a9e5-3edcbcf2aeb9',name: 'Francis Rodrigüez',alias: 'Mr Lea'},{ _id: 23,external_id: 'e9db9277-af4a-4ca6-99e0-291c8a97623e',name: 'Francis Bailey',alias: 'Miss Singleton'}];
    let arr2 = [ { organizations: 'Multron', joining_key: 1 },{ organizations: 'Bitrex', joining_key: 19 },{ organizations: 'Enthaze', joining_key: 23 },{ tickets: 'A Nuisance in Kiribati', joining_key: 1 },{ tickets: 'A Nuisance in Saint Lucia', joining_key: 19 },{ tickets: 'A Nuisance in Saint Kilda', joining_key: 19 }]
    
    // make lookup 
    let lookup = arr1.reduce((obj, item) => (obj[item._id] = item, obj), {})
    
    // merge objects using lookup
    arr2.forEach(item => {
      let {joining_key, ...rest} = item        // seperate join_key-it's not in the final result 
      Object.assign(lookup[joining_key], rest)
    })
    
    // arr1 now has merged objects
    console.log(console.log(arr1))

    注意:您想要的结果为具有_id: 19 两个tickets 属性的对象。属性在对象上必须是唯一的,所以这是不可能的。

    【讨论】:

      【解决方案3】:

      将数组推入另一个数组Docs

      //array1 with some content
      let array1=["item1","item2"];
      //array2 with some content
      let array2=["item3","item4"];
      //create empty array
      let array3=[];
      //concatenate arrays
      //add array1
      array3.push(array1);
      //add array2
      array3.push(array2);
      //display result
      console.log(array3);
      
      

      【讨论】:

        【解决方案4】:

        使用扩展运算符

        const arr3 = [{ ...arr1[0], ...arr2[0] }]
        

        很简单,不是吗?

        在您的情况下,这将返回一个包含单个对象的数组(这两个对象现在组合在一起)

        【讨论】:

          【解决方案5】:

          我认为这个会给你答案,我不知道它是否是最好的解决方案,但它对我有用。

          arr1.forEach(element => {
            var filtered = arr2.filter(obj => obj.joining_key === element._id);
            filtered.forEach(filtered_object => {
              let i = 0;
              Object.keys(filtered_object).forEach(key => {
                if (i == 0) {
                  element[key] = filtered_object[key]
                }
                i = i + 1;
              })
            })
          })
          

          【讨论】:

            猜你喜欢
            • 2017-02-22
            • 1970-01-01
            • 1970-01-01
            • 2023-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多