合并对象数组

时间:2019-04-05 23:33:44

标签: javascript ecmascript-6

我有两个对象数组。如何将它们组合/合并为一个对象数组。

我尝试使用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'
  }]

5 个答案:

答案 0 :(得分:1)

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

更多关于传播算子的参考,位于https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

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)

答案 1 :(得分:1)

通过编辑,这是一个完全不同的问题。您的数组具有_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属性。属性在对象上必须是唯一的,所以这是不可能的。

答案 2 :(得分:0)

使用点差运算符

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

很简单,不是吗?

在您的情况下,这将返回一个具有单个对象的数组(两个对象现已合并)

答案 3 :(得分:0)

将数组推入另一个数组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 :(得分:0)

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

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;
    })
  })
})