Задать вопрос
@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});
    }
  });
});

Муторно. Может существует какая то библиотека для таких случаев?
  • Вопрос задан
  • 1436 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 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) )

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

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

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 12:39
1000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект