搜索比折叠if语句更好的解决方案,用于对象的未定义属性

时间:2014-08-19 09:38:22

标签: javascript object if-statement undefined

这是关于if语句的一个非常基本的问题。它不一定只影响javascript。

如果object.userundefined,则会中断:

if ( object.user.name ) {
  sayMyName();
} else {
  object.user = {};
  object.user.name = 'Jane Doe';
  sayMyName();
}

因为它无法读取未定义的属性。所以我将其他东西放在一个函数中并将if折叠到另一个if:

function anonymous(object) {
  object.user = {};
  object.user.name = 'Jane Doe';
  sayMyName();
}

if ( object.user ) {
  if ( object.user.name ) {
    sayMyName();
  } else {
    anonymous();
  }
} else {
  anonymous();
}

但这对我来说看起来很糟糕。这种情况一定是个常见问题。或者至少我经常这样做。对此有什么好的解决方案吗?

编辑:

@Mritunjay的提议

if(object && object.user && object.user.name){...}

更好,但它似乎不是最好的解决方案。想象一下试图获得obj.some.very.very.deep.property的if语句。我正在尝试编写一个像checkPropertySafely(object.user.name);这样的辅助函数,它返回object,并且无论它有多深,都会递归检查每个属性。所以基本上我尝试自动化@Mritunjay的手工书面声明。

2 个答案:

答案 0 :(得分:2)

我在这种情况下使用bellow

if(object.user && object.user.name){...}

顺便说一句,你应该检查object是否也存在。

if(object && object.user && object.user.name){...}

答案 1 :(得分:0)

我终于想出了如何编写辅助函数。这是:

function propertyExists(property) {
    var statement = '';
    var prevItem = '';

    property.split(".").forEach(function(item, index) {
        if (index != 0) {statement += ' && '}
        statement += prevItem+item;
        prevItem += item+'.';
    });

    return eval(statement);
}

使用此功能,我现在可以简单地执行此操作:

if ( propertyExists('object.user.name') ) {
  sayMyName();
} else {
  anonymous();
}