从对象(包括父对象)递归删除undefined

时间:2017-05-04 11:09:27

标签: javascript jquery

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

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

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

4 个答案:

答案 0 :(得分:2)

Depth-first递归应该能够处理它:

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);

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

答案 1 :(得分:2)

以下示例可以帮助您入门。

没有带空值的删除键:

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

function loop(obj) {
  var t = obj;
  for (var v in t) {
    if (typeof t[v] == "object")
      loop(t[v]);
    else if (t[v] == undefined)
      delete t[v];
  }
  return t;
}

var output = loop(test);

console.log(output);

删除包含空值的键:

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

function loop(obj) {
  var t = obj;
  for (var v in t) {
    if (typeof t[v] == "object")
      if (!t[v].length)
        delete t[v];
      else
        loop(t[v]);
    else if (t[v] == undefined)
      delete t[v];
  }
  return t;
}

var output = loop(test);

console.log(output);

答案 2 :(得分:0)

IMO,这要干净得多,但可能慢一些

STATS

答案 3 :(得分:-1)

这是代码,它还将从主对象中删除未定义的包含键和空对象。



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

function loop(obj) {
  var t = obj;

  for (var v in t) {
      if (typeof t[v] == "object"){
         loop(t[v]);
         if(!Object.keys(t[v]).length){  
            delete t[v];
         }
      } else if (t[v] == undefined){
        delete t[v];
      }
   }
 
  return t;
}

var output = loop(test);
console.log(output);