问题
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.
回答1:
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);
回答2:
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);
回答3:
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);
回答4:
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)
来源:https://stackoverflow.com/questions/57428074/javascript-reach-element-by-a-path-array