@krll-k

У меня есть два объекта-коллекции, как объединить их?

var a = [
  { city:"Москва", population: 11504 },
  { city:"Санкт-Петербург", population: 4880 },
  { city:"Новосибирск", population: 1350 }
];
var b = [
  { city:"Москва", density: 2562 },
  { city:"Санкт-Петербург", density: 1403 },
  { city:"Екатеринбург", density: 468 }
];

Как сделать чтобы вывод был таким
[ { city:"Москва",  population: 11504, density: 2562 },
  { city:"Санкт-Петербург", population: 4880, density: 1403 },
  { city:"Новосибирск", population: 1350 }
  { city:"Екатеринбург", density: 468 } ];

На коленках я соорудил такой код
var c = [];
a.forEach(function(a){
  b.forEach(function(b){
    if(a.city == b.city){
      c.push({city:a.city, population:a.population, density:b.density});
    }
  });
});

Муторно. Может существует какая то библиотека для таких случаев?
  • Вопрос задан
  • 1276 просмотров
Решения вопроса 3
Negwereth
@Negwereth
lvivcss.com.ua
const map = new Map();

[...a, ...b].forEach(item => {
  if (map.has(item.city)) {
    Object.assign(map.get(item.city), item);
  } else {
    map.set(item.city, item);
  }
});

const merged = [...map.values()];

console.log(merged);
Ответ написан
Комментировать
amux
@amux
alp.ac
Lodash, assign или merge.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Не просто муторно, ваш код не скопирует ни Новосибирск ни Екатеринбург.
function myMerge() {
  return [].reduce.call(arguments, (index, list) => {
    list.forEach(data => {
      index[data.city] = index[data.city] || {};
      for (var key in data) {
        if (data.hasOwnProperty(key)) index[data.city][key] = data[key];
      }
    })
    return index;
  }, {})
}

console.log( myMerge(a, b) )

Набросал пример, который объединит два или больше объектов. Правда на выходе не массив, а тоже объект, ключи которого - названия городов. Если нужен именно массив, то сконвертировать - еще три строчки кода.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы