如何检查对象或其子对象/子对象是否在Javascript中具有属性/键?

如何检查对象或其子对象/子对象是否在Javascript中具有属性/键?,javascript,object,recursion,properties,Javascript,Object,Recursion,Properties,我要寻找的基本上是一个hasOwnProperty()或“in”函数,它是递归的,并向下查看链,以查看对象中是否存在键或属性 例如,我有一个对象: var user = { username: "Derpette", profile: { role: 'admin', sex: 'female', emails:['derpette42@derpmail.com'] } } 我想知道对象或其子对象中是否有键/属性“角色”。 所以我希望能够调用类似于use

我要寻找的基本上是一个hasOwnProperty()或“in”函数,它是递归的,并向下查看链,以查看对象中是否存在键或属性

例如,我有一个对象:

var user = {
  username: "Derpette",
  profile: {
    role: 'admin',
    sex: 'female',
    emails:['derpette42@derpmail.com']
    }
}
我想知道对象或其子对象中是否有键/属性“角色”。 所以我希望能够调用类似于
user.hasProperty('role')
的函数,它将返回
true

现在我使用带有一系列断言的if语句来检查,但它看起来并不干净,尤其是对于深层嵌套属性

例如,我会:

if(user && user.profile && user.profile.role){
    //Manipulate/Use user.profile.role here
}
这个用例的另一个例子是,如果我过滤来自客户端的mongoDB更新修饰符。我想确保他们没有更新自己的角色,所以我需要检查属性“role”是否不在他们的mongoDB修饰符json对象中。但是它可能在修改器中的一些地方,因此,如果属性链接在这种情况下不起作用,那么就执行if属性链接


我是否需要编写自己的递归hasOwnProperty?我认为类似这样的东西应该已经存在于jquery、下划线.js或sugar.js这样的项目中,但我似乎找不到它。

您可以递归地这样做:

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
}

我对这一点的看法是,它并不漂亮,但它在这几行中表现得非常出色

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');