2 qq 35436516 qq_35436516 于 2017.09.15 18:31 提问

如何去除js对象中的空值(undefined,null),以及空对象?

现在有一个对象,需要处理一下,如下:

 var obj = {
    a: {
        a_1: 'qwe',
        a_2: undefined,
        a_3: function(a, b) {
            return a + b;
        },
        a_4: {
            a_4_1: 'qwe',
            a_4_2: undefined,
            a_4_3: function(a, b) {
                return a + b;
            },
            a_4_4: {
                a_4_4_1: undefined,
                a_4_4_2: undefined,
                a_4_4_3: undefined,
                a_4_4_4: {
                    a_4_4_4_1: undefined,
                    a_4_4_4_2: undefined,
                    a_4_4_4_3: undefined,
                    a_4_4_4_4: undefined,
                    a_4_4_4_5: undefined,
                    a_4_4_4_6: undefined
                }
            }
        }
    },
    b: [{
        a_1: 'qwe',
        a_2: undefined,
        a_3: function(a, b) {
            return a + b;
        },
        a_4: {
            a_4_1: 'qwe',
            a_4_2: undefined,
            a_4_3: function(a, b) {
                return a + b;
            },
            a_4_4: {
                a_4_4_1: undefined,
                a_4_4_2: undefined,
                a_4_4_3: undefined,
                a_4_4_4: {
                    a_4_4_4_1: undefined,
                    a_4_4_4_2: undefined,
                    a_4_4_4_3: undefined,
                    a_4_4_4_4: undefined,
                    a_4_4_4_5: undefined,
                    a_4_4_4_6: undefined
                }
            }
        }
    }],
    c: [{
        a: undefined,
        b: undefined,
        c: undefined,
        d: undefined
    }, {
        a: undefined,
        b: undefined,
        c: undefined,
        d: undefined
    }]
};

需要把他处理为这样,如下:

var obj2 = {
    a: {
        a_1: 'qwe',
        a_3: function(a, b) {
            return a + b;
        },
        a_4: {
            a_4_1: 'qwe',
            a_4_3: function(a, b) {
                return a + b;
            }
        }
    },
    b: [{
        a_1: 'qwe',
        a_3: function(a, b) {
            return a + b;
        },
        a_4: {
            a_4_1: 'qwe',
            a_4_3: function(a, b) {
                return a + b;
            }
        }
    }],
    c: [{}, {}]
};

需要注意的地方有:
1.无效值需要去掉,如undefined,null,‘’,{}等;
2.如果其中有属性为js对象,那么如果其中的无效值去掉后变为{},那么这个属性也属于无效值,应该去掉;
3.如果其中有属性是回调函数,则不能影响他的正常使用;
4.如果其中有数组,则不能影响数组的长度,即最多处理为[{},{},{}]。
我过去试过几种方法:
1.JSON.parse(JSON.stringify());会影响其中的回调函数;
2.写过自定义方法,如下:

 function delUndefined(ob) {
    for (let e in ob) {
        if (typeof(ob[e]) === 'undefined' || ob[e] === null) {
            delete ob[e];
        }
        else if (ob[e].constructor === Object) {
            if (Object.keys(ob[e]).length === 0) {
                delete ob[e];
            } else {
                delUndefined(ob[e]);
            }
        }
        else if (ob[e].constructor === Array) {
            ob[e].map(function (seg) {
                if (typeof(seg) === 'object') {
                    delUndefined(seg);
                }
            });
        }
    }
    return ob;
}

但是如果js对象层级太多的话,空js对象{}处理不干净。
现在真是头痛,只好请教前辈们了~~

1个回答

showbo
showbo   Ds   Rxr 2017.09.16 13:30
已采纳

刚写好一个,记得采纳:),使用最后一个模式的函数
javscript删除对象(包括数组)中值为undefined,null的属性

qq_35436516
qq_35436516 回复showbo: enen ,恍然大悟,谢谢前辈了,嘿嘿
2 个月之前 回复
showbo
showbo 回复王蛇无毒: for是遍历数组项(数组还可能有属性,如var a=[];a.xx=11;这样xx也会遍历出来,不但是里面的数组项)或者对象属性,如果没有就会执行最后面的return !0。这样写return true也行了,为了省代码做了个取反运算而已,调用多还是有效率损耗,直接return true、false好点
2 个月之前 回复
qq_35436516
qq_35436516 这中间是简写了什么代码么?
2 个月之前 回复
qq_35436516
qq_35436516 for循环中做了什么处理?或者说这是什么写法,直接可以判断对象是否为空?
2 个月之前 回复
qq_35436516
qq_35436516 回复showbo: enen ,可能我没有说清,返回值我看得懂,那个for循环后面直接返回了true,false,其中是有什么处理么?为什么遍历完以后就可以直接返回布尔值?
2 个月之前 回复
showbo
showbo 回复王蛇无毒: return 1相当于return true。return 0相当于return false。加个!就是取反并且转为布尔变量。你可以看下这个:http://www.w3dev.cn/article/20151215/javascript-if-condition-is-false-value.aspx
2 个月之前 回复
qq_35436516
qq_35436516 中间是简写了什么内容呢?
2 个月之前 回复
qq_35436516
qq_35436516 回复王蛇无毒: 百度什么关键词呢?
2 个月之前 回复
qq_35436516
qq_35436516 谢谢前辈,不过有一句代码不是很懂for (var attr in o) return !1; return !0,还请你给讲一下吧,如果我百度的 话,该怎么查呢?
2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片