2013-07-30 75 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

相关问题