JavaScript 通过使用另一个对象作为选择器来深度删除对象属性

Bla*_*OST 5 javascript recursion object

我有这样的对象:

var myObj = {
    first: {
        sub: {
            prop1: "some text",
            prop2: "some more text"
        },
        sub2: {
            prop1: "Something",
            prop2: "Something2",
        }
    },
    second: {
        stuff: "More stuff...lots of stuff"
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图通过使用另一个对象作为选择器来从此对象中删除属性。例如:

var delSeletor = {
    first: {
        sub: {
            prop2: ""
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以delete( delSelector, myObject)应该返回:

var myObj = {
    first: {
        sub: {
            prop1: "some text",
        },
        sub2: {
            prop1: "Something",
            prop2: "Something2",
        }
    },
    second: {
        stuff: "More stuff...lots of stuff"
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我不是在寻找使用“.dot”选择器的解决方案,例如:delete('first.sub.prop2', myObj)如本线程所示。

Nin*_*olz 3

selector您可以迭代要删除和检查的键的对象

  • 如果key不存在,则返回
  • 如果选择器对象的属性是一个对象,则deleteKeys使用该键再次调用删除函数。否则从源对象中删除键。

function deleteKeys(object, selector) {
    Object.keys(selector).forEach(function (k) {
        if(!(k in object)) {
            return;
        }
        if (typeof selector[k] === 'object') {
            deleteKeys(object[k], selector[k]);
        } else {
            delete object[k];
        }
    });
}

var myObj = { first: { sub: { prop1: "some text", prop2: "some more text" }, sub2: { prop1: "Something", prop2: "Something2", } }, second: { stuff: "More stuff...lots of stuff" } },
    delSeletor = { first: { sub: { prop2: "" } } };

deleteKeys(myObj, delSeletor);

console.log(myObj);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)