Shreerang
Shreerang

Reputation: 387

Remove duplicates and merge JSON objects

I have the following JSON object. I need to remove the duplicates and merge the inner object using plain Javascript. How do I go about doing this?

[{
    "id" : 1,
    "name" : "abc",
    "nodes" :[
        {
            "nodeId" : 20,
            "nodeName" : "test1"
        }
    ]
},
{
    "id" : 1,
    "name" : "abc",
    "nodes" :[
        {
            "nodeId" : 21,
            "nodeName" : "test2"
        }
    ]
}]

Following is the object that I expect as output.

[{
    "id" : 1,
    "name" : "abc",
    "nodes" :[
        {
            "nodeId" : 20,
            "nodeName" : "test1"
        },
        {
            "nodeId" : 21,
            "nodeName" : "test2"
        },
    ]
}]

Regards.

Shreerang

Upvotes: 4

Views: 7927

Answers (2)

Adrian May
Adrian May

Reputation: 2182

If your string is called input, then this:

var inter = {};
for (var i in input) {
    if (!inter.hasOwnProperty(input[i].name)) {
        inter[input[i].name] = input[i].nodes;
        inter[input[i].name].name = input[i].name;
        inter[input[i].name].id = input[i].id;
    }
    else
        inter[input[i].name] = inter[input[i].name].concat(input[i].nodes)
}

results in: {"abc":[{"nodeId":20,"nodeName":"test1"},{"nodeId":21,"nodeName":"test2"}]}

You can see how I'm using an intermediate object keyed by whatever the match criterion is. It's an object rather than an array as you asked, but you can iterate it anyway. In fact you're probably better off with this structure than the array you asked for.

BTW, I shoved a couple of text-named properties: "id" and "name" into an array there. They don't show up in JSON.stringify but they're there.

Upvotes: 0

Guffa
Guffa

Reputation: 700650

First turn the JSON into a Javascript array so that you can easily access it:

var arr = JSON.parse(json);

Then make an array for the result and loop through the items and compare against the items that you put in the result:

var result = [];

for (var i = 0; i < arr.length; i++) {
  var found = false;
  for (var j = 0; j < result.length; j++) {
    if (result[j].id == arr[i].id && result[j].name == arr[i].name) {
      found = true;
      result[j].nodes = result[j].nodes.concat(arr[i].nodes);
      break;
    }
  }
  if (!found) {
    result.push(arr[i]);
  }
}

Then you can create JSON from the array if that is the end result that you need:

json = JSON.stringify(result);

Upvotes: 3

Related Questions