我正在尝试找到一个问题的解决方案,我需要从嵌套对象中删除undefined,包括所有父项,如果没有值,请考虑示例:
var test = {
foo : {
bar : {
baz : undefined
}
},
bar : 1
}
所以我的任务是删除baz以及bar和foo,但仍然在根级别有bar; 我知道使用2 for循环来解决这个简单的任务,我只是想知道是否有更优雅和干净的解决方案将使用递归堆栈? 提前谢谢!
答案 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);