jezrael
jezrael

Reputation: 371

javascript reach element by a path array

I got this path array:

const path = ["a", "b", "c", "d"]

and an object like:

let obj = { "a": { "b": { "c": { "d": 10, "e": 20 } } } }

and I would like to delete that obj["a"]["b"]["c"]["d"] so my obj will be

{ "a": { "b": { "c": { "e": 20 } } } }

I've tried to do some path.forEach looping, appending it but couldn't find a proper way which I appended it as I wish to, so I could access obj to the right place.

Upvotes: 8

Views: 3159

Answers (4)

Nina Scholz
Nina Scholz

Reputation: 386654

You could save the last key and reduce the objects to the final object.

const
    remove = (object, [...keys]) => {
        const last = keys.pop();
        delete keys.reduce((o, k) => o[k] || {}, object)[last];
    },
    path = ["a", "b", "c", "d"],
    obj = { a: { b: { c: { d: 10, e: 20 } } } };


remove(obj, path);
console.log(obj);

Upvotes: 5

nick zoum
nick zoum

Reputation: 7305

You can loop through the path array and in each iteration access that property of the obj object. In the last iteration, instead of entering the last property, delete it.

var path = ["a", "b", "c", "d"];
var obj = { "a": { "b": { "c": { "d": 10, "e": 20 } } } };

path.reduce(function(result, key, index) {
  if (index === path.length - 1) delete result[key];
  else return result[key];
}, obj);

console.log(obj);

Upvotes: 5

Nicolae Maties
Nicolae Maties

Reputation: 2675

let obj = { "a": { "b": { "c": { "d": 10, "e": 20 } } } };
const path = ["a", "b", "c", "d"];

const recursiveLookup = (obj) => {
  path.forEach((el) => {
    if(typeof obj[el] === 'object'){
      recursiveLookup(obj[el])
    } else {
      delete obj[el];
    }
  });
};
recursiveLookup(obj);

console.log(obj)

Upvotes: 0

Nick Parsons
Nick Parsons

Reputation: 50834

You could do this recursively and then use delete to remove the final key-value pair in your base-case:

const path = ["a", "b", "c", "d"]
const obj = { "a": { "b": { "c": { "d": 10, "e": 20 } } } };

const remove_from_path = (obj, [prop, ...rest]) => 
  !rest.length ? delete obj[prop] : remove_from_path(obj[prop], rest);

remove_from_path(obj, path);
console.log(obj);

Upvotes: 19

Related Questions