search

Home  >  Q&A  >  body text

javascript - 如何使用js深度删除对象中value为''空的属性?

如题,对于一个多层嵌套的对象。例如

var o = {
  a:1,
  b:{b_a:''},
  c:{c_a:1,c_b:''}
}

通过处理,希望得到

{
  a:1,
  c:{c_a:1}
}

尝试过这个方法(stackOverflow):

function removeEmpty(obj) {
  Object.keys(obj).forEach(function(key) {
    (obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key]) ||
    (obj[key] === undefined || obj[key] === null) && delete obj[key]
  });
  return obj;
};

没有成功.求一个删除空value''和空对象{}的属性方法,蟹蟹。

PHPzPHPz2896 days ago228

reply all(2)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 17:26:42

    试试下面代码,没用函式库,直接作两次递回,第一次去空字串,第二次是去空对象,没细测过大量资料时的效能,但可得出你要的结果。再深层一些可再试试:

    function isEmpty(obj) {
       return (Object.keys(obj).length === 0 && obj.constructor === Object);
    }
    
    function deleteEmptyString(test, recurse) {
        
        for (var i in test) {
            if (test[i] === '' ) {
                delete test[i];
            } else if (recurse && typeof test[i] === 'object') {
                deleteEmptyString(test[i], recurse);
            }
        }
           
    }
    
    function deleteEmptyObject(test, recurse) {
        
        for (var i in test) {
            if (isEmpty(test[i]) ) {
                delete test[i];
            } else if (recurse && typeof test[i] === 'object') {
                deleteEmptyObject(test[i], recurse);
            }
        }
           
    }
    
    
    
    var o = {
      a:1,
      b:{b_a:''},
      c:{c_a:1,c_b:''},
      //d:{d_a:1,d_b:'', d_c: { x:'', y:1}, d_d:{ z:'' } }
    }
    
    
    
    deleteEmptyString(o, true);
    console.log(o);
    
    deleteEmptyObject(o,true);
    console.log(o);

    参考自: http://stackoverflow.com/ques...

    http://stackoverflow.com/ques...

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 17:26:42

    有借鉴一楼

    //无论是空字符串、空整形、空对象都返回true
    function isEmpty(obj){
        var _isEmpty = false;
        if(typeof obj ==='string'||typeof obj ==='number'){
            _isEmpty = !obj;
        }else if(isPlainObj(obj)){
            var value = "";
            for(var i in obj){
                value += obj[i];
            }
            _isEmpty = !value;
        }
    
        return _isEmpty;
    }
    
    //判断是否是字面量对象
    function isPlainObj(obj){
        return (obj instanceof Object )&& (obj.constructor === Object);
    }
    
    function deleteEmptyObj (key,container){
        container = container||window;
        if(isEmpty(container[key])){
            delete container[key];
        }else if(isPlainObj(container[key])){
            for(var i in container[key]){
                deleteEmptyObj(i,container[key]);
            }
        }
    }
    
    
    var o = {
      a:1,
      b:{b_a:''},
      c:{c_a:1,c_b:''}
    };
    //就是调用比较奇怪一点
    deleteEmptyObj('o',window);

    reply
    0
  • Cancelreply