Search code examples
javascriptobjectlodashjavascript-objects

Multi-level objects - destructive merge based off keys


I have two objects. Basically a model and data situation. Can't figure out how to recursively delete items in the data object, that have been removed from the model.

First is the model:

var foo = {
  "title": "Enter title",
  "info": {
    "released": "Enter year",
    "runtime": "Enter time"
  }
}

The other one is the data:

var bar = {
  "title": "Forrest Gump",
  "info": {
    "released": "1994",
    "runtime": "02:22",
    "awards": "3"
  }
  "genre": "Drama/Comedy-drama"
}

I'm trying to do a generic comparison between two objects that would result in:

var bar = {
  "title": "Forrest Gump",
  "info": {
    "released": "1994",
    "runtime": "02:22"
  }
}

Any help would be very appreciated!

A super bonus would be if it would be able to add object keys+values that exist in the blueprint but not in the data. I have that working separately, but it would be a nice bonus!


Solution

  • A recursive function over Object.keys should work perfectly:

    var foo = {
      "title": "Enter title",
      "info": {
        "released": "Enter year",
        "runtime": "Enter time"
      }
    };
    
    var bar = {
      "title": "Forrest Gump",
      "info": {
        "released": "1994",
        "runtime": "02:22",
        "awards": "3"
      },
      "genre": "Drama/Comedy-drama"
    }
    
    function getBoth(base, data) {
      var result = {};
      Object.keys(base).forEach(key => {
        if (typeof base[key] == "object" && data[key]) {
          result[key] = getBoth(base[key], data[key]);
        } else if (data[key]) {
          result[key] = data[key];
        }
      });
      return result;
    }
    
    console.log(getBoth(foo, bar));