Javascript 删除具有未定义值的属性后删除空对象

Javascript 删除具有未定义值的属性后删除空对象,javascript,Javascript,我有一个目标: { a: undefined, b: 'B', c: { d: undefined } } 我想删除所有未定义值的属性,如果对象为空,则删除父属性 function removeEmpty (object) { Object.keys(object).forEach((key) => { if (object[key] && typeof object[key] === 'objec

我有一个目标:

{
   a: undefined,
   b: 'B',
   c: { d: undefined }
}
我想删除所有未定义值的属性,如果对象为空,则删除父属性

function removeEmpty (object) {
            Object.keys(object).forEach((key) => {
                if (object[key] && typeof object[key] === 'object') {
                     removeEmpty(object[key]);
                }
                else if (object[key] == null || !object[key].length) delete object[key]
            });

            return object;
        }

我理解这不起作用,因为当object[key]指向“c”proerty时,这个不是空的。

只需检查清理后是否可以移除该对象(实际上,这正是Felix Kling建议的)。该版本还解决了Keith指出的问题:

function removeEmpty(object) {
    Object.keys(object).forEach((key) => {
        if (object[key] && typeof object[key] === 'object') {
            removeEmpty(object[key]);
            if (Object.keys(object[key]).length === 0) // <---- Check whether there
                delete object[key];                      // <---- no objects in current one
        }
        else if (object[key] == null || (typeof object[key] === 'object' && object[key].length === 0)) {
            delete object[key];
        }
    });

    return object;
}
removeEmpty({
    a: undefined,
    b: 'B',
    c: { d: undefined },
    test: 1,
    test2: 0,
    test3: []
})

// Produces {b: "B", test: 1, test2: 0}
函数removempty(对象){
Object.keys(对象).forEach((键)=>{
if(对象[键]&&typeof对象[键]==“对象”){
removempty(对象[键]);

如果(Object.keys(Object[key]).length==0)//undefined在JSON中是无效的,那么一个小技巧就是对对象进行字符串化并将其解析回来。例如,
JSON.parse(JSON.stringify(obj))
@Keith,施华洛世奇先生说的不是objecstjsons@assembler我知道..阅读我的完整响应…只需添加
if(Object.keys(Object[key]).length==0){delete object[key];}
调用
removempty(object[key]);
?谢谢大家。@FelixKling的答案很好!
{removeMe:undefined,test:1}
=
{
这就是您的期望吗?@Keith说得好。我将OP的代码复制到了的工作中,并且只解决了一个特定问题。我相信更新后的代码工作得更好。感谢您对细节的关注!使用新版本,您将删除评估为
false
的有效属性,例如
false
本身,或者
0
。使用原始版本(具有
!object[key].length
条件)作者正在删除空数组(也有效)@Andrea我的回答应该是针对OPs最初的问题,而不是确保所有可能输入的代码的完整性和正确性。我甚至没有一组单元测试来声明API契约以安全开始,我同意你的看法。事实上,它不是针对
,我想删除所有未定义
req的属性uest,因为它不仅删除了
未定义的
值,而且还删除了
评估值。现在它删除了。
function removeEmpty(object) {
    Object.keys(object).forEach((key) => {
        if (object[key] && typeof object[key] === 'object') {
            removeEmpty(object[key]);
            if (Object.keys(object[key]).length === 0) // <---- Check whether there
                delete object[key];                    // <---- no objects in current one
        }
        else if (object[key] == null || !object[key].length) delete object[key]
    });

    return object;
}