Search code examples
javascriptarrayslodash

how to Add key value pair to tree structure object using lodash


I need to add key value pair at the end of the tree like json object.

[{
    "name": "minpur",
    "children": [{
        "name": "ppp1",
        "children": [{
            "name": "feeder",
            "children": [{
                "name": "rmu16",
                "children": [{
                    "name": "invt16",
                    "children": [{
                        "aname": "inv 01"
                    }]
                }]
            }]
        }]
    }]
}]

Expected

[{
  "name": "minpur",
  "children": [{
    "name": "ppp1",
    "children": [{
      "name": "feeder",
      "children": [{
        "name": "rmu16",
        "children": [{
          "name": "invt16",
          "children": [{
            "aname": "inv 01",
            **
            "value": 300 **
          }]
        }]
      }]
    }]
  }]
}]

tried recursive function as below

let traverse = function(jsonObj) {
  if (jsonObj !== null && typeof jsonObj == "object") {
    return Object.entries(jsonObj).forEach(([key, value]) => {
      if (key != "aname") {
        traverse(value);
      } else {
        return value;
      }
    });
  }
}

Solution

  • Check if the aname key exists on the object, and add the property if it does. If it doesn't iterate the children with Array.forEach(), and calls traverse on the children.

    const traverse = (key, value) => obj => {
      const inner = obj => {
        if(obj.hasOwnProperty(key)) obj.value = value
        else obj.children.forEach(inner)
      }
      
      return inner(obj)
    }
    
    const tree = [{"name":"minpur","children":[{"name":"ppp1","children":[{"name":"feeder","children":[{"name":"rmu16","children":[{"name":"invt16","children":[{"aname":"inv 01"}]}]}]}]}]}]
    
    tree.forEach(traverse('aname', 300))
    
    console.log(tree)