javascript - 递归地从对象(包括父对象)中删除未定义的

标签 javascript jquery

我正在尝试找到一个问题的解决方案,如果那里没有值,我需要从包括所有父对象在内的嵌套对象中删除未定义的问题,请考虑示例:

var test = {
  foo : {
    bar : {
      baz : undefined
    }
  },
  bar : 1
}

因此,我的任务是删除 baz 以及 bar 和 foo,但在根级别仍然有 bar; 我知道用 2 个 for 循环来解决是微不足道的任务,我只是想知道是否有更优雅和干净的解决方案将使用递归堆栈来代替? 提前致谢!

最佳答案

深度优先递归应该可以搞定:

function cleanse(obj, path) {
    Object.keys(obj).forEach(function(key) {
        // Get this value and its type
        var value = obj[key];
        var type = typeof value;
        if (type === "object") {
            // Recurse...
            cleanse(value);
            // ...and remove if now "empty" (NOTE: insert your definition of "empty" here)
            if (!Object.keys(value).length) {
                delete obj[key]
            }
        }
        else if (type === "undefined") {
            // Undefined, remove it
            delete obj[key];
        }
    });
}

例子:

var test = {
  foo : {
    bar : {
      baz : undefined
    }
  },
  bar : 1
};
cleanse(test);
function cleanse(obj, path) {
    Object.keys(obj).forEach(function(key) {
        // Get this value and its type
        var value = obj[key];
        var type = typeof value;
        if (type === "object") {
            // Recurse...
            cleanse(value);
            // ...and remove if now "empty" (NOTE: insert your definition of "empty" here)
            if (!Object.keys(value).length) {
                delete obj[key]
            }
        }
        else if (type === "undefined") {
            // Undefined, remove it
            delete obj[key];
        }
    });
}
console.log(test);

请注意,它只会访问名称不是 Symbols (ES2015+) 的对象的自己可枚举 属性。如果您还想处理从原型(prototype)继承的属性,或不可枚举的属性,或名称为 Symbols 的属性,则需要进行调整以进行处理。 (您可以通过 getOwnPropertyNames 在 ES5 或更高版本的 JavaScript 引擎上获取不可枚举的属性。)

关于javascript - 递归地从对象(包括父对象)中删除未定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43781215/

相关文章:

javascript - 尝试向操作提交 formik 表单

javascript - 按日期javascript对JSON数据进行排序

javascript - jQuery live() 函数用于网站大量使用 ajax

javascript - Knockout.js:如何获取当前表单?

javascript - 使用 JS/jQuery PIE 移动的元素未更新

javascript - 右键单击就像左键单击事件

javascript - 以编程方式渲染 Redux 表单字段

javascript - 我的代码在本地和在 codepen 或 plunker 中的执行方式不同

javascript - 如何仅将类应用于特定的表列?

jquery - 用于 jQuery Vin 验证的 CSS