通过“path”数组删除嵌套的obejct属性

时间:2018-01-09 13:54:26

标签: javascript arrays javascript-objects

假设我有一个这样的对象:

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属性现已消失。

2 个答案:

答案 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']