How to merge objects if certain keys and values match in JavaScript?

Talal Najam :

I want to merge the last keys that can be any random string of all the objects in the array if the fname and address is same. To give more context, I need this format to draw a graph with recharts.

const data = [
  {
    fname: "adam",
    address: "us",
    key1: 12
  },
  {
    fname: "adam",
    address: "us",
    key2: 31
  },
  {
    fname: "adam",
    address: "uk",
    qwe: 41
  },
  {
    fname: "Dan",
    address: "au",
    asd: 31
  },
  {
    fname: "Dan",
    address: "au",
    zxc: 31
  },
  {
    fname: "Chris",
    address: "nz",
    randomkey: 12 
  },
  {
    fname: "Chris",
    address: "br",
    randomkey2: 14 
  },
];

This should return something like

const data = [
  {
    fname: "adam",
    address: "us",
    key1: 12,
    key2: 31
  },
  {
    fname: "adam",
    address: "uk",
    qwe: 41
  },
  {
    fname: "Dan",
    address: "au",
    asd: 31,
    zxc: 31
  },
  {
    fname: "Chris",
    address: "nz",
    randomkey: 12 
  },
  {
    fname: "Chris",
    address: "br",
    randomkey2: 14 
  },
];
GriffoGoes :

Using a very naive approach, you could create a hash map to collect the unique name + address, then iterate over the map. Something like this:

const data = [{}, {}, {}] //...data in question
var map = {};
data.forEach(function(item) {
  var id = item.fname + "|" + item.address; // | cannot occur in address or name
  if (map[id] === undefined) {
    map[id] = item;
  } else {
    var existing = map[id]; // adding/updating new keys
    for (var propt in item) {
      existing[propt] = item[propt];
    }
  }
});
var results = [];
Object.keys(map).forEach(k => results.push(map[k]));

Then results should hold your processed data

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=319493&siteId=1