如果他们未定义,必须检查Obj.key1,Obj.key2,...,Obj.key(n-1)。
正常惯例是:
if (typeof Obj !== 'undefined') {
if (typeof Obj.key1 !== 'undefined') {
if (typeof Obj.key1.key2 !== 'undefined')
...
if (typeof Obj.key1.key2...keyN !== 'undefined') {
return Obj.key1.key2...keyN
}
...
}
}
}
答案 0 :(得分:2)
通常,代码会稍微缩短为
if (obj && obj.key1 && obj.key1.key2 && obj.key1.key2.key3) {
return obj.key1.key2.key3.key4;
}
因为undefined
也是假的,任何对象都是真的。
较短但IMO在逻辑上较为丑陋的替代方案是
try { return obj.key1.key2.key3.key4; } catch(e) { }
如果你从不使用Javascript属性,那么可能是可以接受的,因为它可以隐藏非平凡访问者中的错误。
答案 1 :(得分:0)
var x;
try {
x = Obj.key1.key2.key3.key4....keyN;
}
catch(err) {
console.warn( err );
}
答案 2 :(得分:0)
我通常使用这段代码,我称之为解析属性。
function resolveProperty(object, property, deep) {
if(typeof deep === 'undefined') {
deep = true;
}
if(typeof property === 'string' && deep) {
property = property.split('.');
}
if(!object) {
return null;
}
if(!deep) {
property = Array.isArray(property) ? property[0] : property;
if(typeof property === 'undefined') {
return object;
} else {
return object[property];
}
}
return resolveProperty(object[property.shift()], property, property.length > 1);
}
$('#results').append(' > ' + resolveProperty({ a: {}}, 'a.b') + '<br />');
$('#results').append(' > ' + resolveProperty({ a: {}}, 'a.b.c.d') + '<br />');
$('#results').append(' > ' + resolveProperty({ a: { b: 1 }}, 'a.b') + '<br />');
$('#results').append(' > ' + resolveProperty({ a: { b: 1 }}, 'a.b.c') + '<br />');
$('#results').append(' > ' + resolveProperty({ a: { b: { c: '123' } }}, 'a.b.c') + '<br />');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="results" />
它将实际解析属性,以便您可以比较未定义的
if(resolveProperty(yourObject, 'a.b.c.d.e')) {
//good to go
}
PS。:如果您要在浏览器中运行此代码,您可能想要替换阵列验证方法(Array.isArray
),因为它不是默认的(跨浏览器)。
答案 3 :(得分:0)
我不一定推荐这种解决方案,但你可以做到
function getPath(obj, path) {
return path.split(.).reduce(function(val, seg) {
return val && typeof val === 'object' && val[seg];
}, obj);
}
现在你可以做到
getPath(Obj, 'key1.key2.key3...keyN')
如果您是CoffeeScript用户,可以使用所谓的“存在操作员”:
Obj.key1?.key2?.key3?...keyN