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

标签 javascript object recursion

我有这样的对象:

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

我试图通过使用另一个对象作为选择器来移除该对象的属性。例如:

var delSeletor = {
    first: {
        sub: {
            prop2: ""
        }
    }
}

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

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

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

最佳答案

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

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

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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于JavaScript 通过使用另一个对象作为选择器来深度删除对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44306791/

相关文章:

python - 通过递归的汉明距离

php - 在 Javascript 中顺序执行命令

python 动态对象查询

javascript - 如何访问桑基图的节点属性

scala - Scala中对象的Mockito

javascript - 制作对象数组时的封装问题

C# 递归深度 - 你能走多深

java - 无法弄清楚如何将回溯合并到我的伪递归方法中

javascript - anchor 标记上的 HTML 属性在页面加载时执行 Javascript

javascript - 使用JavaScript动态更改YouTube播放器的大小?