Объединить несколько массивов в один javascript

249
21 апреля 2017, 20:53

Есть три массива с повторяющимся _id ключами, нужно их смержить или объединить в один, при этом что-бы не было дубликатов с ключём _id.

var arr1 = [
  {
    '_id': '1',
    'man': 20
  },
  {
    '_id': '2',
    'man': 15
  }
]

var arr2 = [
  {
    '_id': '1',
    'woman': 13
  },
  {
    '_id': '2',
    'woman': 18
  }
]
var arr3 = [
  {
    '_id': '1',
    'animal': 2
  },
  {
    '_id': '2',
    'animal': 8
  }
]

Нужно что-бы в результате получилось так

[
   {
    '_id': '1',
    'woman': 13
    'man': 20
    'animal': 2
  },
  {
    '_id': '2',
    'woman': 18
    'man': 15
    'animal': 8
  }
]

Каким образом сделать объединение массивов эффективно в одном цикле? Или может есть специальный метод lodash?

Answer 1

var arr1 = [{ _id: '1', man: 20 }, { _id: '2', man: 15 }] 
  , arr2 = [{ _id: '1', woman: 13 }, { _id: '2', woman: 18 }] 
  , arr3 = [{ _id: '1', animal: 2 }, { _id: '2', animal: 8 }]; 
 
var id = '_id' 
  , data = {}; 
[].concat(arr1, arr2, arr3).forEach(function(item) { 
  if (id in item) { 
    var key = item[id]; 
    data[key] = data[key] || {}; 
    Object.keys(item).forEach(function(property) { 
      data[key][property] = item[property]; 
    }); 
  }     
}); 
var result = Object.values(data); 
console.log(result);

Answer 2

var arr1 = [{'_id': '1','man': 20}, {'_id': '2','man': 15}]; 
var arr2 = [{'_id': '1','woman': 13}, {'_id': '2','woman': 18}]; 
var arr3 = [{'_id': '1','animal': 2}, {'_id': '2','animal': 8}]; 
 
var merged = Object.create(null); 
 
arr1.concat(arr2, arr3).forEach(function (obj) { 
    merged[obj._id] = Object.assign(merged[obj._id] || {}, obj); 
}); 
 
console.log(merged); 
// Если нужен именно массив 
console.log(Object.values(merged));

READ ALSO
Webpack не ребилдит файл при изменениях

Webpack не ребилдит файл при изменениях

если поменять содержимое scriptjs, и запустить комманду webpack-dev-server модуль тоже билдится с новым кодом

198
Проблема с @connect декораторами в react-redux

Проблема с @connect декораторами в react-redux

для старта react-приложения использую стандартный create-react-app от фейсбука

332
Как получить Cookie после POST запроса

Как получить Cookie после POST запроса

Авторизация (а тут именно она) проходит, все необходимые данные получаю, но проблема в том, дабы каждый раз не логинится заново, что не получаю...

201
Элемент не движется при скролле

Элемент не движется при скролле

Почему при скролле вниз песик не двигается(он должен переместится с право на лево)

266