2016-09-03 169 views
1

如何查找對象是否爲空即使它具有屬性。如何檢查對象是否爲空或填充空支撐

例如

// 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 

問:

有一些很好的辦法如何檢查的對象是不知道每一個可能的屬性的名稱是空的?

我發現了什麼,但可能不是最好的解決辦法:

這是prolly我的問題解決方案,但它的方式在更大對象複雜。

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

基本上就是這樣。您必須遞歸遍歷對象圖尋找具有值的屬性。 – Pointy

+0

沒有其他辦法。你寫的是解決方案。對於更大的對象,您只需使該方法自行調用即可。 – Masterakos

回答

0
console.log(isEmpty(obj2)); // false but should be true 

這根本不是真的。

如果

var obj2 = {"oneProp": {"subProp": []}}; 

然後obj2其實並不可言,因爲subProp的。

然後是的,你必須循環遍歷對象來檢查每個屬性。

+0

我的意思是在我的情況,而不是一般在編程:)我說我的問題頂部 – Andurit

+0

哇,對不起,錯了:) – steo

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