Deleting from an object using JavaScript












12














I have an object as shown:



const arr = [
{
name: 'FolderA',
child: [
{
name: 'FolderB',
child: [
{
name: 'FolderC0',
child: ,
},
{
name: 'FolderC1',
child: ,
},
],
},
],
},
{
name: 'FolderM',
child: ,
},
];


And I have path as string:



var path = "0-0-1".


I have to delete the object:



{
name: 'FolderC1',
child: ,
},


Which I can do so by doing,



arr[0].child[0].splice(1, 1);


But I want to do it dynamically. Since path string can be anything, I want the above '.' operator and splice definition to be created dynamically to splice at particular place.










share|improve this question
























  • Have a look at Convert JavaScript string in dot notation into a reference to the object
    – Bergi
    Dec 18 at 20:51
















12














I have an object as shown:



const arr = [
{
name: 'FolderA',
child: [
{
name: 'FolderB',
child: [
{
name: 'FolderC0',
child: ,
},
{
name: 'FolderC1',
child: ,
},
],
},
],
},
{
name: 'FolderM',
child: ,
},
];


And I have path as string:



var path = "0-0-1".


I have to delete the object:



{
name: 'FolderC1',
child: ,
},


Which I can do so by doing,



arr[0].child[0].splice(1, 1);


But I want to do it dynamically. Since path string can be anything, I want the above '.' operator and splice definition to be created dynamically to splice at particular place.










share|improve this question
























  • Have a look at Convert JavaScript string in dot notation into a reference to the object
    – Bergi
    Dec 18 at 20:51














12












12








12


1





I have an object as shown:



const arr = [
{
name: 'FolderA',
child: [
{
name: 'FolderB',
child: [
{
name: 'FolderC0',
child: ,
},
{
name: 'FolderC1',
child: ,
},
],
},
],
},
{
name: 'FolderM',
child: ,
},
];


And I have path as string:



var path = "0-0-1".


I have to delete the object:



{
name: 'FolderC1',
child: ,
},


Which I can do so by doing,



arr[0].child[0].splice(1, 1);


But I want to do it dynamically. Since path string can be anything, I want the above '.' operator and splice definition to be created dynamically to splice at particular place.










share|improve this question















I have an object as shown:



const arr = [
{
name: 'FolderA',
child: [
{
name: 'FolderB',
child: [
{
name: 'FolderC0',
child: ,
},
{
name: 'FolderC1',
child: ,
},
],
},
],
},
{
name: 'FolderM',
child: ,
},
];


And I have path as string:



var path = "0-0-1".


I have to delete the object:



{
name: 'FolderC1',
child: ,
},


Which I can do so by doing,



arr[0].child[0].splice(1, 1);


But I want to do it dynamically. Since path string can be anything, I want the above '.' operator and splice definition to be created dynamically to splice at particular place.







javascript object






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Dec 18 at 19:32









Peter Mortensen

13.4k1983111




13.4k1983111










asked Dec 18 at 11:13









Michael Philips

539521




539521












  • Have a look at Convert JavaScript string in dot notation into a reference to the object
    – Bergi
    Dec 18 at 20:51


















  • Have a look at Convert JavaScript string in dot notation into a reference to the object
    – Bergi
    Dec 18 at 20:51
















Have a look at Convert JavaScript string in dot notation into a reference to the object
– Bergi
Dec 18 at 20:51




Have a look at Convert JavaScript string in dot notation into a reference to the object
– Bergi
Dec 18 at 20:51












5 Answers
5






active

oldest

votes


















14














You could reduce the indices by saving the last index and returning the children of the actual index. Later splice with the last index.






function deepSplice(array, path) {
var indices = path.split('-'),
last = indices.pop();

indices
.reduce((a, i) => a[i].child, array)
.splice(last, 1);
}

const array = [{ name: 'FolderA', child: [{ name: 'FolderB', child: [{ name: 'FolderC0', child: }, { name: 'FolderC1', child: }] }] }, { name: 'FolderM', child: }];

deepSplice(array, "0-0-1");
console.log(array);

.as-console-wrapper { max-height: 100% !important; top: 0; }








share|improve this answer





















  • Wow!!! thanks a lot. Guess I have to do in depth Javascript learning.
    – Michael Philips
    Dec 18 at 11:33



















3














You could split your path and use the parts, like so:



let path = '0-0-1';
let parts = path.split('-');

// Call your splice using your parts (unsure if your '1' is the index, or deleteCount).

// If parts[2] is the index
arr[parts[0]].child[parts[1]].splice(parts[2], 1);

// If parts[2] is the deleteCount:
arr[parts[0]].child[parts[1]].splice(1, parts[2]);





share|improve this answer





















  • This I want to be dynamic, I don't know how long the path nested would be: arr[parts[0]].child[parts[1]].splice(1, parts[2]);
    – Michael Philips
    Dec 18 at 11:29










  • Does your string of 0-0-1 change in length / depth?
    – Stuart
    Dec 18 at 11:29



















2














You could write a recursive function which travels down the hierarchy till the path is available. Below is a very minimal snippet.






const arr = [
{
name: 'FolderA',
child: [
{
name: 'FolderB',
child: [
{
name: 'FolderC0',
child: ,
},
{
name: 'FolderC1',
child: ,
},
],
},
],
},
{
name: 'FolderM',
child: ,
},
];

let ar_path = "0-0-1";

function deleteRecursive(arr, path) {
if(Array.isArray(arr) && path.length > 0){
const index = Number(path.shift());
if (path.length > 0)
deleteRecursive(arr[index].child, path)
else
arr.slice(index, 1);
} else {
console.log('invalid');
}
}


deleteRecursive(arr, ar_path.split('-'))

console.log(arr);








share|improve this answer





























    0














    If the path is always going to be composed by 3 (or less) indices you can do it easily like the following:






    function deleteByPath(arr, path) {
    const index = path.split('-').map((x) => +x);
    if ( index.length < 1) {
    return null;
    } else if ( 1 === index.length ) {
    return arr.splice(index[0], 1);
    } else if ( 2 === index.length ) {
    return arr[index[0]].child.splice(index[1], 1);
    } else {
    return arr[index[0]].child[index[1]].child.splice(index[2], 1);
    }
    }

    const arr = [
    {
    name: 'FolderA',
    child: [
    {
    name: 'FolderB',
    child: [
    {
    name: 'FolderC0',
    child: ,
    },
    {
    name: 'FolderC1',
    child: ,
    },
    ],
    },
    ],
    },
    {
    name: 'FolderM',
    child: ,
    },
    ];

    console.log(deleteByPath(arr, "0-0-1"));
    console.log(deleteByPath(arr, "0-1"));
    console.log(deleteByPath(arr, "0"));





    If the path is going to be composed of maybe less than 3 parts you can adjust the function deleteByPath to handle cases based on number of parts.



    if the path is going to be arbitrary and can have any length you can adjust the deleteByPath function to be recursive like the following:



    function deleteByIndexRecursive(arr, index, current) {
    return current+1 < index.length ? deleteByIndexRecursive(arr.child[index[current]], current+1) : arr.child.splice(index[current], 1);
    }
    function deleteByPath(arr, path) {
    const index = path.split('-').map((x) => +x);
    if ( 1>index.length) {
    return null;
    } else if ( 1===index.length) {
    return arr.splice(index[0], 1);
    } else {
    return deleteByIndexRecursive(arr[index[0]], index, 1);
    }
    }





    share|improve this answer























    • No, path can be of any length :)
      – Michael Philips
      Dec 18 at 11:24










    • @MichaelPhilips, updated answer to handle path of 1,2 or 3 parts. You can add more cases as needed by example
      – Nikos M.
      Dec 18 at 11:28



















    0

















    //Variable setup:
    const arr = [
    {
    name: 'FolderA',
    child: [
    {
    name: 'FolderB',
    child: [
    {
    name: 'FolderC0',
    child: ,
    },
    {
    name: 'FolderC1',
    child: ,
    },
    ],
    },
    ],
    },
    {
    name: 'FolderM',
    child: ,
    },
    ];
    const path = "0-0-1";
    //Break the path into pieces to iterate through:
    const pathArray = path.split("-");
    //Javascript assignments are by reference, so arrayToManage is going to be an internal piece within the original array
    let arrayToManage = arr;
    //We are going to iterate through the children of the array till we get above where we want to remove
    while(pathArray.length > 1){
    const key = parseInt(pathArray.shift());
    arrayToManage = arrayToManage[key].child;
    }
    //Get the last position of the last array, where we want to remove the item
    const key = parseInt(pathArray.shift());
    arrayToManage.splice(key,1);
    //And because it's all by reference, changed we made to arrayToManage were actually made on the arr object
    console.log("end result:", JSON.stringify(arr));








    share|improve this answer





















      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53831793%2fdeleting-from-an-object-using-javascript%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      5 Answers
      5






      active

      oldest

      votes








      5 Answers
      5






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      14














      You could reduce the indices by saving the last index and returning the children of the actual index. Later splice with the last index.






      function deepSplice(array, path) {
      var indices = path.split('-'),
      last = indices.pop();

      indices
      .reduce((a, i) => a[i].child, array)
      .splice(last, 1);
      }

      const array = [{ name: 'FolderA', child: [{ name: 'FolderB', child: [{ name: 'FolderC0', child: }, { name: 'FolderC1', child: }] }] }, { name: 'FolderM', child: }];

      deepSplice(array, "0-0-1");
      console.log(array);

      .as-console-wrapper { max-height: 100% !important; top: 0; }








      share|improve this answer





















      • Wow!!! thanks a lot. Guess I have to do in depth Javascript learning.
        – Michael Philips
        Dec 18 at 11:33
















      14














      You could reduce the indices by saving the last index and returning the children of the actual index. Later splice with the last index.






      function deepSplice(array, path) {
      var indices = path.split('-'),
      last = indices.pop();

      indices
      .reduce((a, i) => a[i].child, array)
      .splice(last, 1);
      }

      const array = [{ name: 'FolderA', child: [{ name: 'FolderB', child: [{ name: 'FolderC0', child: }, { name: 'FolderC1', child: }] }] }, { name: 'FolderM', child: }];

      deepSplice(array, "0-0-1");
      console.log(array);

      .as-console-wrapper { max-height: 100% !important; top: 0; }








      share|improve this answer





















      • Wow!!! thanks a lot. Guess I have to do in depth Javascript learning.
        – Michael Philips
        Dec 18 at 11:33














      14












      14








      14






      You could reduce the indices by saving the last index and returning the children of the actual index. Later splice with the last index.






      function deepSplice(array, path) {
      var indices = path.split('-'),
      last = indices.pop();

      indices
      .reduce((a, i) => a[i].child, array)
      .splice(last, 1);
      }

      const array = [{ name: 'FolderA', child: [{ name: 'FolderB', child: [{ name: 'FolderC0', child: }, { name: 'FolderC1', child: }] }] }, { name: 'FolderM', child: }];

      deepSplice(array, "0-0-1");
      console.log(array);

      .as-console-wrapper { max-height: 100% !important; top: 0; }








      share|improve this answer












      You could reduce the indices by saving the last index and returning the children of the actual index. Later splice with the last index.






      function deepSplice(array, path) {
      var indices = path.split('-'),
      last = indices.pop();

      indices
      .reduce((a, i) => a[i].child, array)
      .splice(last, 1);
      }

      const array = [{ name: 'FolderA', child: [{ name: 'FolderB', child: [{ name: 'FolderC0', child: }, { name: 'FolderC1', child: }] }] }, { name: 'FolderM', child: }];

      deepSplice(array, "0-0-1");
      console.log(array);

      .as-console-wrapper { max-height: 100% !important; top: 0; }








      function deepSplice(array, path) {
      var indices = path.split('-'),
      last = indices.pop();

      indices
      .reduce((a, i) => a[i].child, array)
      .splice(last, 1);
      }

      const array = [{ name: 'FolderA', child: [{ name: 'FolderB', child: [{ name: 'FolderC0', child: }, { name: 'FolderC1', child: }] }] }, { name: 'FolderM', child: }];

      deepSplice(array, "0-0-1");
      console.log(array);

      .as-console-wrapper { max-height: 100% !important; top: 0; }





      function deepSplice(array, path) {
      var indices = path.split('-'),
      last = indices.pop();

      indices
      .reduce((a, i) => a[i].child, array)
      .splice(last, 1);
      }

      const array = [{ name: 'FolderA', child: [{ name: 'FolderB', child: [{ name: 'FolderC0', child: }, { name: 'FolderC1', child: }] }] }, { name: 'FolderM', child: }];

      deepSplice(array, "0-0-1");
      console.log(array);

      .as-console-wrapper { max-height: 100% !important; top: 0; }






      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered Dec 18 at 11:19









      Nina Scholz

      174k1388152




      174k1388152












      • Wow!!! thanks a lot. Guess I have to do in depth Javascript learning.
        – Michael Philips
        Dec 18 at 11:33


















      • Wow!!! thanks a lot. Guess I have to do in depth Javascript learning.
        – Michael Philips
        Dec 18 at 11:33
















      Wow!!! thanks a lot. Guess I have to do in depth Javascript learning.
      – Michael Philips
      Dec 18 at 11:33




      Wow!!! thanks a lot. Guess I have to do in depth Javascript learning.
      – Michael Philips
      Dec 18 at 11:33













      3














      You could split your path and use the parts, like so:



      let path = '0-0-1';
      let parts = path.split('-');

      // Call your splice using your parts (unsure if your '1' is the index, or deleteCount).

      // If parts[2] is the index
      arr[parts[0]].child[parts[1]].splice(parts[2], 1);

      // If parts[2] is the deleteCount:
      arr[parts[0]].child[parts[1]].splice(1, parts[2]);





      share|improve this answer





















      • This I want to be dynamic, I don't know how long the path nested would be: arr[parts[0]].child[parts[1]].splice(1, parts[2]);
        – Michael Philips
        Dec 18 at 11:29










      • Does your string of 0-0-1 change in length / depth?
        – Stuart
        Dec 18 at 11:29
















      3














      You could split your path and use the parts, like so:



      let path = '0-0-1';
      let parts = path.split('-');

      // Call your splice using your parts (unsure if your '1' is the index, or deleteCount).

      // If parts[2] is the index
      arr[parts[0]].child[parts[1]].splice(parts[2], 1);

      // If parts[2] is the deleteCount:
      arr[parts[0]].child[parts[1]].splice(1, parts[2]);





      share|improve this answer





















      • This I want to be dynamic, I don't know how long the path nested would be: arr[parts[0]].child[parts[1]].splice(1, parts[2]);
        – Michael Philips
        Dec 18 at 11:29










      • Does your string of 0-0-1 change in length / depth?
        – Stuart
        Dec 18 at 11:29














      3












      3








      3






      You could split your path and use the parts, like so:



      let path = '0-0-1';
      let parts = path.split('-');

      // Call your splice using your parts (unsure if your '1' is the index, or deleteCount).

      // If parts[2] is the index
      arr[parts[0]].child[parts[1]].splice(parts[2], 1);

      // If parts[2] is the deleteCount:
      arr[parts[0]].child[parts[1]].splice(1, parts[2]);





      share|improve this answer












      You could split your path and use the parts, like so:



      let path = '0-0-1';
      let parts = path.split('-');

      // Call your splice using your parts (unsure if your '1' is the index, or deleteCount).

      // If parts[2] is the index
      arr[parts[0]].child[parts[1]].splice(parts[2], 1);

      // If parts[2] is the deleteCount:
      arr[parts[0]].child[parts[1]].splice(1, parts[2]);






      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered Dec 18 at 11:18









      Stuart

      5,13121429




      5,13121429












      • This I want to be dynamic, I don't know how long the path nested would be: arr[parts[0]].child[parts[1]].splice(1, parts[2]);
        – Michael Philips
        Dec 18 at 11:29










      • Does your string of 0-0-1 change in length / depth?
        – Stuart
        Dec 18 at 11:29


















      • This I want to be dynamic, I don't know how long the path nested would be: arr[parts[0]].child[parts[1]].splice(1, parts[2]);
        – Michael Philips
        Dec 18 at 11:29










      • Does your string of 0-0-1 change in length / depth?
        – Stuart
        Dec 18 at 11:29
















      This I want to be dynamic, I don't know how long the path nested would be: arr[parts[0]].child[parts[1]].splice(1, parts[2]);
      – Michael Philips
      Dec 18 at 11:29




      This I want to be dynamic, I don't know how long the path nested would be: arr[parts[0]].child[parts[1]].splice(1, parts[2]);
      – Michael Philips
      Dec 18 at 11:29












      Does your string of 0-0-1 change in length / depth?
      – Stuart
      Dec 18 at 11:29




      Does your string of 0-0-1 change in length / depth?
      – Stuart
      Dec 18 at 11:29











      2














      You could write a recursive function which travels down the hierarchy till the path is available. Below is a very minimal snippet.






      const arr = [
      {
      name: 'FolderA',
      child: [
      {
      name: 'FolderB',
      child: [
      {
      name: 'FolderC0',
      child: ,
      },
      {
      name: 'FolderC1',
      child: ,
      },
      ],
      },
      ],
      },
      {
      name: 'FolderM',
      child: ,
      },
      ];

      let ar_path = "0-0-1";

      function deleteRecursive(arr, path) {
      if(Array.isArray(arr) && path.length > 0){
      const index = Number(path.shift());
      if (path.length > 0)
      deleteRecursive(arr[index].child, path)
      else
      arr.slice(index, 1);
      } else {
      console.log('invalid');
      }
      }


      deleteRecursive(arr, ar_path.split('-'))

      console.log(arr);








      share|improve this answer


























        2














        You could write a recursive function which travels down the hierarchy till the path is available. Below is a very minimal snippet.






        const arr = [
        {
        name: 'FolderA',
        child: [
        {
        name: 'FolderB',
        child: [
        {
        name: 'FolderC0',
        child: ,
        },
        {
        name: 'FolderC1',
        child: ,
        },
        ],
        },
        ],
        },
        {
        name: 'FolderM',
        child: ,
        },
        ];

        let ar_path = "0-0-1";

        function deleteRecursive(arr, path) {
        if(Array.isArray(arr) && path.length > 0){
        const index = Number(path.shift());
        if (path.length > 0)
        deleteRecursive(arr[index].child, path)
        else
        arr.slice(index, 1);
        } else {
        console.log('invalid');
        }
        }


        deleteRecursive(arr, ar_path.split('-'))

        console.log(arr);








        share|improve this answer
























          2












          2








          2






          You could write a recursive function which travels down the hierarchy till the path is available. Below is a very minimal snippet.






          const arr = [
          {
          name: 'FolderA',
          child: [
          {
          name: 'FolderB',
          child: [
          {
          name: 'FolderC0',
          child: ,
          },
          {
          name: 'FolderC1',
          child: ,
          },
          ],
          },
          ],
          },
          {
          name: 'FolderM',
          child: ,
          },
          ];

          let ar_path = "0-0-1";

          function deleteRecursive(arr, path) {
          if(Array.isArray(arr) && path.length > 0){
          const index = Number(path.shift());
          if (path.length > 0)
          deleteRecursive(arr[index].child, path)
          else
          arr.slice(index, 1);
          } else {
          console.log('invalid');
          }
          }


          deleteRecursive(arr, ar_path.split('-'))

          console.log(arr);








          share|improve this answer












          You could write a recursive function which travels down the hierarchy till the path is available. Below is a very minimal snippet.






          const arr = [
          {
          name: 'FolderA',
          child: [
          {
          name: 'FolderB',
          child: [
          {
          name: 'FolderC0',
          child: ,
          },
          {
          name: 'FolderC1',
          child: ,
          },
          ],
          },
          ],
          },
          {
          name: 'FolderM',
          child: ,
          },
          ];

          let ar_path = "0-0-1";

          function deleteRecursive(arr, path) {
          if(Array.isArray(arr) && path.length > 0){
          const index = Number(path.shift());
          if (path.length > 0)
          deleteRecursive(arr[index].child, path)
          else
          arr.slice(index, 1);
          } else {
          console.log('invalid');
          }
          }


          deleteRecursive(arr, ar_path.split('-'))

          console.log(arr);








          const arr = [
          {
          name: 'FolderA',
          child: [
          {
          name: 'FolderB',
          child: [
          {
          name: 'FolderC0',
          child: ,
          },
          {
          name: 'FolderC1',
          child: ,
          },
          ],
          },
          ],
          },
          {
          name: 'FolderM',
          child: ,
          },
          ];

          let ar_path = "0-0-1";

          function deleteRecursive(arr, path) {
          if(Array.isArray(arr) && path.length > 0){
          const index = Number(path.shift());
          if (path.length > 0)
          deleteRecursive(arr[index].child, path)
          else
          arr.slice(index, 1);
          } else {
          console.log('invalid');
          }
          }


          deleteRecursive(arr, ar_path.split('-'))

          console.log(arr);





          const arr = [
          {
          name: 'FolderA',
          child: [
          {
          name: 'FolderB',
          child: [
          {
          name: 'FolderC0',
          child: ,
          },
          {
          name: 'FolderC1',
          child: ,
          },
          ],
          },
          ],
          },
          {
          name: 'FolderM',
          child: ,
          },
          ];

          let ar_path = "0-0-1";

          function deleteRecursive(arr, path) {
          if(Array.isArray(arr) && path.length > 0){
          const index = Number(path.shift());
          if (path.length > 0)
          deleteRecursive(arr[index].child, path)
          else
          arr.slice(index, 1);
          } else {
          console.log('invalid');
          }
          }


          deleteRecursive(arr, ar_path.split('-'))

          console.log(arr);






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Dec 18 at 11:25









          Shubham Khatri

          78k1492127




          78k1492127























              0














              If the path is always going to be composed by 3 (or less) indices you can do it easily like the following:






              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( index.length < 1) {
              return null;
              } else if ( 1 === index.length ) {
              return arr.splice(index[0], 1);
              } else if ( 2 === index.length ) {
              return arr[index[0]].child.splice(index[1], 1);
              } else {
              return arr[index[0]].child[index[1]].child.splice(index[2], 1);
              }
              }

              const arr = [
              {
              name: 'FolderA',
              child: [
              {
              name: 'FolderB',
              child: [
              {
              name: 'FolderC0',
              child: ,
              },
              {
              name: 'FolderC1',
              child: ,
              },
              ],
              },
              ],
              },
              {
              name: 'FolderM',
              child: ,
              },
              ];

              console.log(deleteByPath(arr, "0-0-1"));
              console.log(deleteByPath(arr, "0-1"));
              console.log(deleteByPath(arr, "0"));





              If the path is going to be composed of maybe less than 3 parts you can adjust the function deleteByPath to handle cases based on number of parts.



              if the path is going to be arbitrary and can have any length you can adjust the deleteByPath function to be recursive like the following:



              function deleteByIndexRecursive(arr, index, current) {
              return current+1 < index.length ? deleteByIndexRecursive(arr.child[index[current]], current+1) : arr.child.splice(index[current], 1);
              }
              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( 1>index.length) {
              return null;
              } else if ( 1===index.length) {
              return arr.splice(index[0], 1);
              } else {
              return deleteByIndexRecursive(arr[index[0]], index, 1);
              }
              }





              share|improve this answer























              • No, path can be of any length :)
                – Michael Philips
                Dec 18 at 11:24










              • @MichaelPhilips, updated answer to handle path of 1,2 or 3 parts. You can add more cases as needed by example
                – Nikos M.
                Dec 18 at 11:28
















              0














              If the path is always going to be composed by 3 (or less) indices you can do it easily like the following:






              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( index.length < 1) {
              return null;
              } else if ( 1 === index.length ) {
              return arr.splice(index[0], 1);
              } else if ( 2 === index.length ) {
              return arr[index[0]].child.splice(index[1], 1);
              } else {
              return arr[index[0]].child[index[1]].child.splice(index[2], 1);
              }
              }

              const arr = [
              {
              name: 'FolderA',
              child: [
              {
              name: 'FolderB',
              child: [
              {
              name: 'FolderC0',
              child: ,
              },
              {
              name: 'FolderC1',
              child: ,
              },
              ],
              },
              ],
              },
              {
              name: 'FolderM',
              child: ,
              },
              ];

              console.log(deleteByPath(arr, "0-0-1"));
              console.log(deleteByPath(arr, "0-1"));
              console.log(deleteByPath(arr, "0"));





              If the path is going to be composed of maybe less than 3 parts you can adjust the function deleteByPath to handle cases based on number of parts.



              if the path is going to be arbitrary and can have any length you can adjust the deleteByPath function to be recursive like the following:



              function deleteByIndexRecursive(arr, index, current) {
              return current+1 < index.length ? deleteByIndexRecursive(arr.child[index[current]], current+1) : arr.child.splice(index[current], 1);
              }
              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( 1>index.length) {
              return null;
              } else if ( 1===index.length) {
              return arr.splice(index[0], 1);
              } else {
              return deleteByIndexRecursive(arr[index[0]], index, 1);
              }
              }





              share|improve this answer























              • No, path can be of any length :)
                – Michael Philips
                Dec 18 at 11:24










              • @MichaelPhilips, updated answer to handle path of 1,2 or 3 parts. You can add more cases as needed by example
                – Nikos M.
                Dec 18 at 11:28














              0












              0








              0






              If the path is always going to be composed by 3 (or less) indices you can do it easily like the following:






              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( index.length < 1) {
              return null;
              } else if ( 1 === index.length ) {
              return arr.splice(index[0], 1);
              } else if ( 2 === index.length ) {
              return arr[index[0]].child.splice(index[1], 1);
              } else {
              return arr[index[0]].child[index[1]].child.splice(index[2], 1);
              }
              }

              const arr = [
              {
              name: 'FolderA',
              child: [
              {
              name: 'FolderB',
              child: [
              {
              name: 'FolderC0',
              child: ,
              },
              {
              name: 'FolderC1',
              child: ,
              },
              ],
              },
              ],
              },
              {
              name: 'FolderM',
              child: ,
              },
              ];

              console.log(deleteByPath(arr, "0-0-1"));
              console.log(deleteByPath(arr, "0-1"));
              console.log(deleteByPath(arr, "0"));





              If the path is going to be composed of maybe less than 3 parts you can adjust the function deleteByPath to handle cases based on number of parts.



              if the path is going to be arbitrary and can have any length you can adjust the deleteByPath function to be recursive like the following:



              function deleteByIndexRecursive(arr, index, current) {
              return current+1 < index.length ? deleteByIndexRecursive(arr.child[index[current]], current+1) : arr.child.splice(index[current], 1);
              }
              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( 1>index.length) {
              return null;
              } else if ( 1===index.length) {
              return arr.splice(index[0], 1);
              } else {
              return deleteByIndexRecursive(arr[index[0]], index, 1);
              }
              }





              share|improve this answer














              If the path is always going to be composed by 3 (or less) indices you can do it easily like the following:






              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( index.length < 1) {
              return null;
              } else if ( 1 === index.length ) {
              return arr.splice(index[0], 1);
              } else if ( 2 === index.length ) {
              return arr[index[0]].child.splice(index[1], 1);
              } else {
              return arr[index[0]].child[index[1]].child.splice(index[2], 1);
              }
              }

              const arr = [
              {
              name: 'FolderA',
              child: [
              {
              name: 'FolderB',
              child: [
              {
              name: 'FolderC0',
              child: ,
              },
              {
              name: 'FolderC1',
              child: ,
              },
              ],
              },
              ],
              },
              {
              name: 'FolderM',
              child: ,
              },
              ];

              console.log(deleteByPath(arr, "0-0-1"));
              console.log(deleteByPath(arr, "0-1"));
              console.log(deleteByPath(arr, "0"));





              If the path is going to be composed of maybe less than 3 parts you can adjust the function deleteByPath to handle cases based on number of parts.



              if the path is going to be arbitrary and can have any length you can adjust the deleteByPath function to be recursive like the following:



              function deleteByIndexRecursive(arr, index, current) {
              return current+1 < index.length ? deleteByIndexRecursive(arr.child[index[current]], current+1) : arr.child.splice(index[current], 1);
              }
              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( 1>index.length) {
              return null;
              } else if ( 1===index.length) {
              return arr.splice(index[0], 1);
              } else {
              return deleteByIndexRecursive(arr[index[0]], index, 1);
              }
              }





              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( index.length < 1) {
              return null;
              } else if ( 1 === index.length ) {
              return arr.splice(index[0], 1);
              } else if ( 2 === index.length ) {
              return arr[index[0]].child.splice(index[1], 1);
              } else {
              return arr[index[0]].child[index[1]].child.splice(index[2], 1);
              }
              }

              const arr = [
              {
              name: 'FolderA',
              child: [
              {
              name: 'FolderB',
              child: [
              {
              name: 'FolderC0',
              child: ,
              },
              {
              name: 'FolderC1',
              child: ,
              },
              ],
              },
              ],
              },
              {
              name: 'FolderM',
              child: ,
              },
              ];

              console.log(deleteByPath(arr, "0-0-1"));
              console.log(deleteByPath(arr, "0-1"));
              console.log(deleteByPath(arr, "0"));





              function deleteByPath(arr, path) {
              const index = path.split('-').map((x) => +x);
              if ( index.length < 1) {
              return null;
              } else if ( 1 === index.length ) {
              return arr.splice(index[0], 1);
              } else if ( 2 === index.length ) {
              return arr[index[0]].child.splice(index[1], 1);
              } else {
              return arr[index[0]].child[index[1]].child.splice(index[2], 1);
              }
              }

              const arr = [
              {
              name: 'FolderA',
              child: [
              {
              name: 'FolderB',
              child: [
              {
              name: 'FolderC0',
              child: ,
              },
              {
              name: 'FolderC1',
              child: ,
              },
              ],
              },
              ],
              },
              {
              name: 'FolderM',
              child: ,
              },
              ];

              console.log(deleteByPath(arr, "0-0-1"));
              console.log(deleteByPath(arr, "0-1"));
              console.log(deleteByPath(arr, "0"));






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Dec 18 at 11:36

























              answered Dec 18 at 11:22









              Nikos M.

              4,37221823




              4,37221823












              • No, path can be of any length :)
                – Michael Philips
                Dec 18 at 11:24










              • @MichaelPhilips, updated answer to handle path of 1,2 or 3 parts. You can add more cases as needed by example
                – Nikos M.
                Dec 18 at 11:28


















              • No, path can be of any length :)
                – Michael Philips
                Dec 18 at 11:24










              • @MichaelPhilips, updated answer to handle path of 1,2 or 3 parts. You can add more cases as needed by example
                – Nikos M.
                Dec 18 at 11:28
















              No, path can be of any length :)
              – Michael Philips
              Dec 18 at 11:24




              No, path can be of any length :)
              – Michael Philips
              Dec 18 at 11:24












              @MichaelPhilips, updated answer to handle path of 1,2 or 3 parts. You can add more cases as needed by example
              – Nikos M.
              Dec 18 at 11:28




              @MichaelPhilips, updated answer to handle path of 1,2 or 3 parts. You can add more cases as needed by example
              – Nikos M.
              Dec 18 at 11:28











              0

















              //Variable setup:
              const arr = [
              {
              name: 'FolderA',
              child: [
              {
              name: 'FolderB',
              child: [
              {
              name: 'FolderC0',
              child: ,
              },
              {
              name: 'FolderC1',
              child: ,
              },
              ],
              },
              ],
              },
              {
              name: 'FolderM',
              child: ,
              },
              ];
              const path = "0-0-1";
              //Break the path into pieces to iterate through:
              const pathArray = path.split("-");
              //Javascript assignments are by reference, so arrayToManage is going to be an internal piece within the original array
              let arrayToManage = arr;
              //We are going to iterate through the children of the array till we get above where we want to remove
              while(pathArray.length > 1){
              const key = parseInt(pathArray.shift());
              arrayToManage = arrayToManage[key].child;
              }
              //Get the last position of the last array, where we want to remove the item
              const key = parseInt(pathArray.shift());
              arrayToManage.splice(key,1);
              //And because it's all by reference, changed we made to arrayToManage were actually made on the arr object
              console.log("end result:", JSON.stringify(arr));








              share|improve this answer


























                0

















                //Variable setup:
                const arr = [
                {
                name: 'FolderA',
                child: [
                {
                name: 'FolderB',
                child: [
                {
                name: 'FolderC0',
                child: ,
                },
                {
                name: 'FolderC1',
                child: ,
                },
                ],
                },
                ],
                },
                {
                name: 'FolderM',
                child: ,
                },
                ];
                const path = "0-0-1";
                //Break the path into pieces to iterate through:
                const pathArray = path.split("-");
                //Javascript assignments are by reference, so arrayToManage is going to be an internal piece within the original array
                let arrayToManage = arr;
                //We are going to iterate through the children of the array till we get above where we want to remove
                while(pathArray.length > 1){
                const key = parseInt(pathArray.shift());
                arrayToManage = arrayToManage[key].child;
                }
                //Get the last position of the last array, where we want to remove the item
                const key = parseInt(pathArray.shift());
                arrayToManage.splice(key,1);
                //And because it's all by reference, changed we made to arrayToManage were actually made on the arr object
                console.log("end result:", JSON.stringify(arr));








                share|improve this answer
























                  0












                  0








                  0









                  //Variable setup:
                  const arr = [
                  {
                  name: 'FolderA',
                  child: [
                  {
                  name: 'FolderB',
                  child: [
                  {
                  name: 'FolderC0',
                  child: ,
                  },
                  {
                  name: 'FolderC1',
                  child: ,
                  },
                  ],
                  },
                  ],
                  },
                  {
                  name: 'FolderM',
                  child: ,
                  },
                  ];
                  const path = "0-0-1";
                  //Break the path into pieces to iterate through:
                  const pathArray = path.split("-");
                  //Javascript assignments are by reference, so arrayToManage is going to be an internal piece within the original array
                  let arrayToManage = arr;
                  //We are going to iterate through the children of the array till we get above where we want to remove
                  while(pathArray.length > 1){
                  const key = parseInt(pathArray.shift());
                  arrayToManage = arrayToManage[key].child;
                  }
                  //Get the last position of the last array, where we want to remove the item
                  const key = parseInt(pathArray.shift());
                  arrayToManage.splice(key,1);
                  //And because it's all by reference, changed we made to arrayToManage were actually made on the arr object
                  console.log("end result:", JSON.stringify(arr));








                  share|improve this answer















                  //Variable setup:
                  const arr = [
                  {
                  name: 'FolderA',
                  child: [
                  {
                  name: 'FolderB',
                  child: [
                  {
                  name: 'FolderC0',
                  child: ,
                  },
                  {
                  name: 'FolderC1',
                  child: ,
                  },
                  ],
                  },
                  ],
                  },
                  {
                  name: 'FolderM',
                  child: ,
                  },
                  ];
                  const path = "0-0-1";
                  //Break the path into pieces to iterate through:
                  const pathArray = path.split("-");
                  //Javascript assignments are by reference, so arrayToManage is going to be an internal piece within the original array
                  let arrayToManage = arr;
                  //We are going to iterate through the children of the array till we get above where we want to remove
                  while(pathArray.length > 1){
                  const key = parseInt(pathArray.shift());
                  arrayToManage = arrayToManage[key].child;
                  }
                  //Get the last position of the last array, where we want to remove the item
                  const key = parseInt(pathArray.shift());
                  arrayToManage.splice(key,1);
                  //And because it's all by reference, changed we made to arrayToManage were actually made on the arr object
                  console.log("end result:", JSON.stringify(arr));








                  //Variable setup:
                  const arr = [
                  {
                  name: 'FolderA',
                  child: [
                  {
                  name: 'FolderB',
                  child: [
                  {
                  name: 'FolderC0',
                  child: ,
                  },
                  {
                  name: 'FolderC1',
                  child: ,
                  },
                  ],
                  },
                  ],
                  },
                  {
                  name: 'FolderM',
                  child: ,
                  },
                  ];
                  const path = "0-0-1";
                  //Break the path into pieces to iterate through:
                  const pathArray = path.split("-");
                  //Javascript assignments are by reference, so arrayToManage is going to be an internal piece within the original array
                  let arrayToManage = arr;
                  //We are going to iterate through the children of the array till we get above where we want to remove
                  while(pathArray.length > 1){
                  const key = parseInt(pathArray.shift());
                  arrayToManage = arrayToManage[key].child;
                  }
                  //Get the last position of the last array, where we want to remove the item
                  const key = parseInt(pathArray.shift());
                  arrayToManage.splice(key,1);
                  //And because it's all by reference, changed we made to arrayToManage were actually made on the arr object
                  console.log("end result:", JSON.stringify(arr));





                  //Variable setup:
                  const arr = [
                  {
                  name: 'FolderA',
                  child: [
                  {
                  name: 'FolderB',
                  child: [
                  {
                  name: 'FolderC0',
                  child: ,
                  },
                  {
                  name: 'FolderC1',
                  child: ,
                  },
                  ],
                  },
                  ],
                  },
                  {
                  name: 'FolderM',
                  child: ,
                  },
                  ];
                  const path = "0-0-1";
                  //Break the path into pieces to iterate through:
                  const pathArray = path.split("-");
                  //Javascript assignments are by reference, so arrayToManage is going to be an internal piece within the original array
                  let arrayToManage = arr;
                  //We are going to iterate through the children of the array till we get above where we want to remove
                  while(pathArray.length > 1){
                  const key = parseInt(pathArray.shift());
                  arrayToManage = arrayToManage[key].child;
                  }
                  //Get the last position of the last array, where we want to remove the item
                  const key = parseInt(pathArray.shift());
                  arrayToManage.splice(key,1);
                  //And because it's all by reference, changed we made to arrayToManage were actually made on the arr object
                  console.log("end result:", JSON.stringify(arr));






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Dec 18 at 12:04









                  Yishai Landau

                  538312




                  538312






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53831793%2fdeleting-from-an-object-using-javascript%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Список кардиналов, возведённых папой римским Каликстом III

                      Deduzione

                      Mysql.sock missing - “Can't connect to local MySQL server through socket”