繁体   English   中英

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

[英]How do I check to see if an object or its children/sub-objects has a property/key in Javascript?

我正在寻找的基本上是一个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或underscores.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');

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM