Search code examples
javascripteval

How to assign a value to nested object by varying key?


I have nested objects, for example:

var a = {b: {c: {d: 1}}};

and a dynamic key:

var field = "b.c.d"

I need to change a value at object a by key b.c.d. Nesting level of object and key can vary. The only thing which works for me is:

eval("a."+field+"=2"); -> it means a.b.c.d = 2;

But it's ugly. Is there a better way?


Solution

  • You can try following using a recursive function

    var a = {b: {c: {d: 1}}};
    var field = "b.c.d";
    var value = 2;
    
    function updateObject(obj, key, val){
      if(obj) {
        if(key.includes(".")) {
          var keys = key.split(".");
          updateObject(obj[keys.shift()], keys.join("."), val);
        } else if (obj.hasOwnProperty(key)) obj[key] = val;
      }
    }
    
    updateObject(a, field, value);
    
    console.log(a);