coder7
coder7

Reputation: 45

Cleaning the json object by removing duplicates and null and merging them into a single record

Cleaning the JSON object by removing duplicates and null and merging them into a single record

The json array looks like this:

var result = 
    [
      {"id":"10035","occupation":null,"state":"FL"},

      {"id":"10035","occupation":"doctor","state":null},

      {"id":"10035","occupation":null,"state":null},
    ]

I want to merge records into one neglecting all the null fields and make it as a single record.Below is my expected output:

[
  {"id":"10035","occupation":"doctor","state":"FL"}
]

Upvotes: 1

Views: 198

Answers (4)

trincot
trincot

Reputation: 350831

You could do it with this ES6 script:

let data = [
      {"id":"10035","occupation":null,"state":"FL"},
      {"id":"10035","occupation":"doctor","state":null},
      {"id":"10035","occupation":null,"state":null},
    ];

let result = Object.values(data.reduce ( (acc, {id, occupation, state}) => {
    acc[id] = Object.assign({ id }, acc[id], 
                                occupation && { occupation },
                                state && { state });
    return acc;
}, {}));

console.log(result);

It will still produce multiple records if you have different id values in your input. When there are more than one non-null values for the other properties, but for the same id, then only the last one will survive.

When you're without support for Object.values

Use this definition of it:

Object.values = Object.values || (o => Object.keys(o).map(k => o[k]));

Upvotes: 2

EJ Mason
EJ Mason

Reputation: 2050

Here is a way to do it in O(n) time:

const mergeObjects = (data) => {
  const dataWithoutDuplicates = {};

  // first pass will get rid of dupes
  let user;
  for(let i = 0; i < data.length; data++) {
    user = data[i];

    if(!dataWithoutDuplicates[user.id]) {
      dataWithoutDuplicates[user.id] = user

    } else {
      Object.keys(dataWithoutDuplicates[user.id]).forEach(key => {

        if(dataWithoutDuplicates[user.id][key] === null && user[key]) {
          dataWithoutDuplicates[user.id][key] = user[key]
        }
      })
  }

  return Object.values(dataWithoutDuplicates)
}

Upvotes: 0

frozen
frozen

Reputation: 2154

Here's a simple to understand example, which works for objects with any number of properties.

let data = [
      {"id":"10035","occupation":null,"state":"FL"},
      {"id":"10035","occupation":"doctor","state":null},
      {"id":"10035","occupation":null,"state":null},
    ];

let result = data[0];
data.forEach(obj=> { // iterate through all objects in array
    for(key in obj) // iterate through all properties of objects
        if(obj[key]) result[key] = obj[key]; // if not null, assign to final result
});

console.log(result);

Upvotes: 0

user6702203
user6702203

Reputation:

var final = {};
for (var i in result) {
  for (var k in result[i]) {
    if (result[i][k] && final[k] !== result[i][k]) {
      final[k] = result[i][k];
    }
  }
}
console.log(final); // outputs: {id: "10035", state: "FL", occupation: "doctor"}

Upvotes: 0

Related Questions