3

执行以下操作可能会出现异常“未定义上没有栏”

var obj = o.Foo.Bar

我能想到安全地做上面的唯一方法:

var obj = (o && o.Foo && o.Foo.Bar ) ? o.Foo.Bar : null;

或者将整个事情放在 try/catch 中,这在大多数情况下对我来说不是一个选项。如果我想要根据缺少的属性发生不同的事情,则会导致更多代码。

有没有一种简洁的方法可以安全地执行此任务?

**更新**

调整了@techfoobar 的答案

function resolve(obj, propertyPath) {
    if (!propertyPath) return;

    var props = propertyPath.split('.');
    var o = obj;
    for(var i in props) {
        o = o[props[i]];
        if(!o) return false;
    }
    return o;
}

var res = resolve(obj, 'ApiResponse.CommandResponse');
if (res){
   for (var i in res){

看起来就像它会得到的一样好......

4

1 回答 1

0

一种方法是将其转移到一个可以在多个场景中重复使用的函数中,而不管你需要走多远:

function resolve(_root) {
   if(arguments.length == 1) return _root; // in case only root is passed
   var o = _root;
   for(var i=1; i<arguments.length; i++) {
      o = o[arguments[i]];
      if(!o) return undefined;
   }
   return o;
}

对于示例对象var o = {x: {y:10, c:{h: 20}}};,您可以像这样使用它:

resolve(o, 'x'){y:10, c:{h: 20}}

resolve(o, 'x', 'c', 'h')20

然而

resolve(o, 'x', 'c', 'boo')undefined

在您的情况下,您可以像这样使用它:

var obj = resolve(o, 'Foo', 'Bar');
if(obj !== undefined) { // successfully resolved
   // do stuff ...
}
于 2013-05-18T17:21:05.420 回答