3
var foo = function(o) {...

参数 o 可能为 null,或者它可能包含也可能不包含某些嵌套对象。

我想找到 o.foo.bar.baz.chomp.mumble 的值。如果任何 mumble 或其包含的对象为空,我想获得空值。

我可以这样做(在这种情况下,我可以假设所有路径元素都是对象或不存在——没有一个是非空的,非对象):

var mumble = o && o.foo && o.foo.bar && o.foo.bar.baz 
   && o.foo.bar.baz.chomp ?  o.foo.bar.baz.chomp.mumble : null;

或者我可以这样做:

var mumble = null;
try { 
   mumble = o.foo.bar.baz.chomp.mumble;
} 
catch { //ignore null pointer exception}

或者我可以这样做:

var nestedVal = function( o, a ) { 

    if( isString( a ) ) {
        a = a.split( '.' );
    }
    var i = 0, j = a.length;
    for( ; o && isObject( o ) && i < j; ++i) { 
        o = o[ a[ i ] ];
    } 
    return i == j ? o : null;
};


var mumble = nestedValue(o, "foo.bar.baz.chomp.mumble");

哪个更可取,还是有第四种更好的方法来做到这一点?

4

1 回答 1

1

这取决于!前两个解决方案修复了属性名称,这似乎过于严格。我倾向于选择您的最后一个解决方案作为最灵活的解决方案。但是我的实现如下:

var nestedVal = function (o, a) { 
    return a.split ('.').reduce (
      function (o, p) { 
        return o && p in o ? o[p] : null; 
      }, o);
};

在您的解决方案中,如果 a 不是字符串,则行为似乎是任意的。您是否允许 a 成为属性名称数组?我的解决方案要求参数 a 是一个字符串。

于 2013-05-11T16:26:17.090 回答