Search code examples
javascriptjsonalgorithmobject

inserting item into a nested javascript object


how does one go about inserting an item into a nested javascript array of objects (with and without using a library)? running to a problem where once you insert the item after traversing, how would you reassign it back to the original object without manually accessing the object like data.content[0].content[0].content[0] etc..? already tried Iterate through Nested JavaScript Objects but could not get the reassignment to work

const data = {
    "content": [
        {
            "name": "a",
            "content": [
                {
                    "name": "b",
                    "content": [
                        {
                            "name": "c",
                            "content": []
                        }
                    ]
                }
            ]
        }
    ]
}

inserting {"name": "d", "content": []} into the contents of c

const data = {
    "content": [
        {
            "name": "a",
            "content": [
                {
                    "name": "b",
                    "content": [
                        {
                            "name": "c",
                            "content": [{"name": "d", "content": []}]
                        }
                    ]
                }
            ]
        }
    ]
}

Solution

  • const data = {
      "content": [{
        "name": "a",
        "content": [{
          "name": "b",
          "content": [{
            "name": "c",
            "content": []
          }]
        }]
      }]
    }
    
    const insert = createInsert(data)
    
    insert({
      "name": "d",
      "content": []
    }, 'c')
    
    console.log(data)
    
    // create a new function that will be able to insert items to the object
    function createInsert(object) {
      return function insert(obj, to) {
        // create a queue with root data object
        const queue = [object]
        // while there are elements in the queue
        while (queue.length) {
          // remove first element from the queue
          const current = queue.shift()
          // if name of the element is the searched one
          if (current.name === to) {
            // push the object into the current element and break the loop
            current.content.push(obj)
            break
          }
          // add child elements to the queue
          for (const item of current.content) {
            queue.push(item)
          }
        }
      }
    }