var foo = function(o) {...参数o可以为空,也可以包含或不包含某些嵌套对象。
我想找出o.foo.bar.baz.chomp.mumble的值。如果任何mumble或其包含的对象为null,我希望获取null。
我可以做到这一点(在这种情况下,我可以假设所有的path元素要么是对象,要么不存在--没有一个是非null、非对象):
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");哪一种更可取,或者有第四种更好的方法来做到这一点?
发布于 2013-05-12 00:26:17
那得看情况!前两个解决方案修复了属性名称,这似乎限制过多。我倾向于选择您的最后一个解决方案,因为它是最灵活的。然而,我的实现如下:
var nestedVal = function (o, a) {
return a.split ('.').reduce (
function (o, p) {
return o && p in o ? o[p] : null;
}, o);
};在您的解决方案中,如果a不是字符串的行为似乎是任意的。您是否允许a作为属性名称的数组?我的解决方案要求参数a是一个字符串。
https://stackoverflow.com/questions/16496227
复制相似问题