Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 632
jezrael Avatar asked Aug 09 '19 10:08

jezrael


3 Answers

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);
like image 151
Nick Parsons Avatar answered Nov 11 '22 04:11

Nick Parsons


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);
like image 20
nick zoum Avatar answered Nov 11 '22 05:11

nick zoum


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);
like image 26
Nina Scholz Avatar answered Nov 11 '22 04:11

Nina Scholz