首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归地从对象(包括父对象)中删除未定义的

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

Stack Overflow用户
提问于 2017-05-04 11:09:26
回答 7查看 3.3K关注 0票数 5

如果没有值,则需要从嵌套对象(包括所有父对象)中删除未定义的对象,如果没有值,请考虑以下示例:

代码语言:javascript
运行
复制
var test = {
  foo : {
    bar : {
      baz : undefined
    }
  },
  bar : 1
}

所以我的任务是删除baz以及bar和foo,但是在根级别仍然有bar;我知道用2 for循环来解决这个问题很简单,我只是想知道是否有更优雅和干净的解决方案来代替递归堆栈?提前感谢!

EN

Stack Overflow用户

回答已采纳

发布于 2017-05-04 11:22:25

深度优先递归应该能够处理它:

代码语言:javascript
运行
复制
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];
        }
    });
}

示例:

代码语言:javascript
运行
复制
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);

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

票数 6
EN
查看全部 7 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43781215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档