如果对象是空的,即使它有属性,如何查找。
e.g。
// this is EMPTY in my case, dispite it have prop
// because prop is empty anyway
var obj2 = {"oneProp": {"subProp": []}};
我尝试了什么:
function isEmpty(data) {
return !_.isEmpty(data);
}
var obj1 = {};
var obj2 = {"oneProp": {"subProp": []}};
console.log(isEmpty(obj1)); //true
console.log(isEmpty(obj2)); // false but should be true
问题:
有没有一些很好的方法如何在不知道每个可能属性的名称的情况下检查对象是否为空?
我发现但可能不是最佳解决方案:
对于我的问题,这是一个很好的解决方案,但它是在更大的对象中复杂化的方法。
var isEmpty = true;
for (var property in object) {
if (object.hasOwnProperty(property)) {
// check if prop is array or
// object and go deeper again
// else check for prop.length
// set isEmpty to false if > 0
}
}
还有其他方式更人性化吗?
答案 0 :(得分:1)
这样的函数可以帮助您快速检查对象是否至少有一个非空属性。此函数将接受任何对象并检查每个(深/嵌套)属性以确定obj是否为空。我们在第一次出现“非空”属性时停止,以节省时间。
function isEmpty(obj) {
var res = true;
for (var prop in obj) {
if (! obj.hasOwnProperty(prop)) { continue; }
var type = typeof obj[prop];
switch (type){
case "object":
res = isEmpty(obj[prop]);
break;
case "boolean":
case "number":
res = false; // boolean cannot be "empty", also 0 is not empty
break;
case "string":
res = ! obj[prop].length;
break;
case "undefined":
res = true;
break;
default:
res = !! obj[prop];
break;
}
if (!res) {break;}
}
return res;
}
var obj1 = {"oneProp": {"subProp": [], "test": ""}};
var obj2 = {"oneProp": {"subProp": [], "test": "1"}};
alert( isEmpty(obj1) )
alert( isEmpty(obj2) )
然而,这种方法相对较慢(hasOwnProperty
检查是主要瓶颈)。如果你需要经常检查,或者有复杂的对象,我会以某种方式缓存结果。可能是这样的:
var _cache = {};
function isEmpty(obj) {
// Try to get the result from the cache.
var json = JSON.stringify(obj);
if (undefined !== _cache[json]) {
return _cache[json];
}
// here is the code from above...
_cache[json] = res; // Add the result to the cache.
return res;
}
答案 1 :(得分:0)
console.log(isEmpty(obj2)); // false but should be true
这根本不是真的。
如果
var obj2 = {"oneProp": {"subProp": []}};
然后obj2
实际上不是为空,因为subProp
。
然后是的,您必须反复遍历该对象以检查每个属性。
答案 2 :(得分:0)
您需要使用递归函数来遍历对象。见下文:
var obj1 = {}; //empty
var obj2 = {"oneProp": {"subProp": []}}; //empty
var obj3 = {"a": {"b": [], c: "not empty"}}; //not empty
var obj4 = {"very": {"deeply": { "nested": {"object": [] } } } } //empty
function isEmptyRecurse(obj) {
return _.isEmpty(obj) || ( _.isObject(obj) && _.every(_.values(obj),isEmptyRecurse) )
}
console.log(isEmptyRecurse(obj1)); //true
console.log(isEmptyRecurse(obj2)); //true
console.log(isEmptyRecurse(obj3)); //false
console.log(isEmptyRecurse(obj4)); //true