2013-07-30 169 views
3

我正在尋找的基本上是一個hasOwnProperty()或'in'函數,它是遞歸的,並在鏈中查看對象中是否存在鍵或屬性。如何檢查一個對象或其子對象/子對象是否具有Javascript中的屬性/鍵?

比如我有對象:

var user = { 
    username: "Derpette", 
    profile: { 
    role: 'admin', 
    sex: 'female', 
    emails:['[email protected]'] 
    } 
} 

我想知道是否有在該對象或其子對象的關鍵/屬性「角色」的任何地方。 所以我想打電話給user.hasProperty('role'),它會返回true

現在我正在使用帶有斷言鏈的if語句來檢查它,但它看起來並不乾淨,特別是對於深層嵌套屬性。

例如,我會做:

if(user && user.profile && user.profile.role){ 
    //Manipulate/Use user.profile.role here 
} 

用例此的另一個例子是,如果我的MongoDB過濾更新修飾符從客戶的到來。我想確保他們沒有更新自己的角色,所以我需要檢查屬性'角色'是不是在他們的mongoDB修飾符json對象的某處。但它可能在修飾符中的一些地方,因此if屬性鏈接對於這種情況不起作用。

我是否需要編寫自己的遞歸hasOwnProperty?我在想,像這樣的東西應該已經存在於像jquery或underscores.js或sugar.js這樣的項目中,但我似乎無法找到它。

+0

我敢肯定沒有一個。但你可以很容易地做出這樣的功能 – Ian

+0

例如:http://jsfiddle.net/N82aZ/2/ – Ian

回答

3

你可以遞歸地做到這一點:

function recHasProp(obj, prop) { 
    for (var p in obj) { 
     if (obj.hasOwnProperty(p)) { 
      if (p === prop) { 
       return obj; 
      } else if (obj[p] instanceof Object && recHasProp(obj[p], prop)) { 
       return obj[p]; 
      } 
     } 
    } 
    return null; 
} 

用法:

var obj = recHasProp(user, 'role'); 
if (obj) { 
    // obj.role exists, and obj is user or a child of user 
} 
+0

謝謝!我真的使用這個:) thumbsup – iulial

1

我拿到這個,這是不漂亮,但它是在幾行,這是非常高性能的。

function hasProp(obj, propPath, i) { 
     if (typeof(i) === 'undefined' && !(i=0)) { 
     propPath = propPath.split('.'); 
     } 
     if (typeof(obj[propPath[i]]) !== 'undefined') { 
     return (++i && i !== propPath.length) ? hasProp(obj[propPath[i - 1]], propPath, i) : true; 
     } 
     return false; 
}; 

用法示例(你的情況):

hasProp(user, 'profile.role'); 

Plunker: http://plnkr.co/edit/CIePivi3XcTEugFzEUyt?p=preview

相關問題