Объединение массивов объектов - PullRequest
2 голосов
/ 06 апреля 2019

У меня есть два массива объектов. Как я могу объединить / объединить их в один массив объекта.

Я пытался использовать функцию 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 }
  ]

Я хочу объединить их, что даст следующий результат, основанный на ключе joining_key, который является полем _id на arr1:

   [{
  _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 ]

1 голос
/ 06 апреля 2019

С правками это совсем другой вопрос.Ваш массив имеет _id свойства, которые вы хотите использовать для поиска элементов.arr1, вероятно, должен быть объектом, который позволил бы найти конкретный элемент с заданным идентификатором, не просматривая весь список.На самом деле, вероятно, лучше создать объект поиска, который вы можете использовать для объединения объектов (хотя вы можете использовать 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 свойствами.Свойства должны быть уникальными для объектов, поэтому это невозможно.

1 голос
/ 06 апреля 2019

Вы можете использовать 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)
0 голосов
/ 06 апреля 2019

Я думаю, что этот ответ даст вам ответы, и я не знаю, является ли это лучшим решением, но это сработало на мне.

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;
    })
  })
})
0 голосов
/ 06 апреля 2019

Вставить массивы в другой массив Документы

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

0 голосов
/ 06 апреля 2019

Используйте оператор распространения

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

Довольно просто, не так ли?

В вашем случае это вернет массив с одним объектом (теперь два объекта объединены)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...