可能重复:
How to remove Empty Properties from a multi depth JavaScript Object?
我想从对象中删除所有空属性(包括空字符串数组)。
{ "someString" : "some text", "someObject" : { "array" : [ "", "" ] } }
E.g。我想从这个示例对象中删除整个分支“someObject”。
我应该如何使用javascript进行此操作?
我可以编写一个递归迭代每个属性并删除空属性的函数,但是在上面的示例对象中,不会删除包含空字符串的数组。
我应该清楚,我正在寻找一个递归函数,它将处理比示例更复杂的对象。任意组合的多级字符串,对象和数组。
问题是递归函数从顶部开始并向下穿过对象。因此,一个非常长(以及其他多余的)分支末尾的空字符串将被删除,但分支本身不会。
答案 0 :(得分:1)
鉴于obj = (your object)
,请使用delete obj.key
从中删除key
。
下面的代码在三遍中迭代对象的每个键。如果该值是字符串,则如果该键为空,则删除该键。如果值是数组,则迭代所有属性,并且仅当数组的所有成员都是空字符串时才删除键。如果值是一个对象,如果对同一函数的递归调用(即支持任何嵌套深度)返回一个没有键的对象,则删除该键。
function removeEmptyStrings(obj) {
for(var key in obj) {
// value is empty string
if(obj[key] === '') {
delete obj[key];
}
// value is array with only emtpy strings
if(obj[key] instanceof Array) {
var empty = true;
for(var i = 0; i < obj[key].length; i++) {
if(obj[key][i] !== '') {
empty = false;
break;
}
}
if(empty)
delete obj[key];
}
// value is object with only empty strings or arrays of empty strings
if(typeof obj[key] === "object") {
obj[key] = removeEmptyStrings(obj[key]);
var hasKeys = false;
for(var objKey in obj[key]) {
hasKeys = true;
break;
}
if(!hasKeys)
delete obj[key];
}
}
return obj;
}
// invoke
var test = { "someString" : "some text", "someObject" : { "array" : [ "", "" ] } };
removeEmptyStrings(test);
答案 1 :(得分:1)
到达底部后,只需如下所示遍历到根:
(function () {
Object.removeEmptiness = removeEmptiness;
function isArray(obj) {
return obj && Object.prototype.toString.call(obj) === "[object Array]" || false;
}
function isObject(obj) {
return obj && typeof obj == "object" || false;
}
function removeEmptiness(root, undef) {
var removeProps;
removeProps = function (obj, key, parent) {
var i, isFullyEmpty = true,
value;
if (isArray(obj)) {
//.length not cached on purpose
for (i = 0; i < obj.length; ++i) {
value = obj[i];
if (isObject(value)) {
removeProps(value, i, obj);
isFullyEmpty = false;
} else if (value === "" || value === undef) {
obj.splice(i--, 1);
} else {
isFullyEmpty = false;
}
}
} else {
for (i in obj) {
value = obj[i];
if (isObject(value)) {
removeProps(value, i, obj);
isFullyEmpty = false;
} else if (value === "" || value === undef) {
delete obj[i];
} else {
isFullyEmpty = false;
}
}
}
if (key !== undef && isFullyEmpty) {
delete parent[key];
removeProps(root);
}
};
removeProps(root);
return root;
}
})();
测试“套件”:
var obj = { "someString" : "some text", "someObject2" : {"k":"", "v": ["k"] }, "someArray3": [{}, ["","",""] ], "someObject" : { "array" : [ "", "", {"hello": ["",""] } ] } };
Object.removeEmptiness( obj );
console.log( JSON.stringify( obj ) );
//"{"someString":"some text","someObject2":{"v":["k"]}}"
答案 2 :(得分:0)
使用delete
关键字
delete obj.someObject