假设我有一个这样的对象:
var test = {
foo: {
bar: {
qwe: 123,
abc: ['x','y','z']
}
}
};
我希望能够使用代表“路径”的数组动态删除我想要的任何属性。
让我解释一下:
deleteProp(test,['foo','bar','qwe']);
应删除test.foo.bar.qwe
。就像delete test.foo.bar.qwe;
一样。
这是我尝试过的:
function deleteProp(obj, pathSegments) {
let lastSubObj = obj
pathSegments.forEach((segment,i)=>{
lastSubObj = lastSubObj[segment] = (i === pathSegments.length-1) ? undefined : {};
});
lastSubObj = undefined;
return obj;
}
但结果是:
{
foo: {
bar: {
qwe: undefined
}
}
}
因此该属性实际上并未删除,除此之外,abc
属性现已消失。
答案 0 :(得分:5)
您可以通过走路径来减少对象。在步行之前,将最后一个属性保存为删除对象的键。
如果属性不在对象中,则回调使用默认对象。
function deleteProp(object, path) {
var last = path.pop();
delete path.reduce((o, k) => o[k] || {}, object)[last];
}
var test = { foo: { bar: { qwe: 123, abc: ['x','y','z'] } } };
deleteProp(test, ['foo', 'bar', 'qwe']);
console.log(test);
答案 1 :(得分:-1)
您正在使用lastSubObj = undefined:
使用youObject.foo.bar['lastSubObj']