如果没有值,则需要从嵌套对象(包括所有父对象)中删除未定义的对象,如果没有值,请考虑以下示例:
var test = {
foo : {
bar : {
baz : undefined
}
},
bar : 1
}所以我的任务是删除baz以及bar和foo,但是在根级别仍然有bar;我知道用2 for循环来解决这个问题很简单,我只是想知道是否有更优雅和干净的解决方案来代替递归堆栈?提前感谢!
发布于 2017-05-04 11:22:25
深度优先递归应该能够处理它:
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+)的对象的自己的、可枚举的属性。如果您还想处理从原型继承的属性,或不可枚举的属性,或者其名称是符号的属性,则需要进行调整以处理这些属性。(您可以通过ES5或更高版本的JavaScript引擎通过getOwnPropertyNames获得不可枚举的属性。)
发布于 2017-05-04 11:24:32
下面的示例可以帮助您开始工作。
没有带空值的删除键的:
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);
发布于 2018-08-25 20:39:30
海事组织,这要干净得多,但可能稍微慢一点。
const cleanUndefined = object => JSON.parse(JSON.stringify(object));
const testWithoutUndefined = cleanUndefined(test)https://stackoverflow.com/questions/43781215
复制相似问题