JSFiddle - React, Tailwind, and code Playground

JavaScript

console.clear()
var a = [
  { city:"Москва", population: 11504 },
  { city:"Санкт-Петербург", population: 4880 },
  { city:"Новосибирск", population: 1350 }
];
var b = [
  { city:"Москва", density: 2562 },
  { city:"Санкт-Петербург", density: 1403 },
  { city:"Екатеринбург", density: 468 }
];
var c = [
  { city:"Москва", color: '#c00' },
  { city:"New York", density: 2562 },
  { city:"Санкт-Петербург", density: 555 }
];

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) )
console.log('бонус', myMerge(a, b, c) )