在使用嵌套对象的Javascript时,我经常做像
这样的事情const configDoc = Config && Config.Settings && Config.Settings.Group &&
Config.Settings.Group.theThingIReallyWanted
是否有获取嵌套引用的简写?
答案 0 :(得分:1)
afaik没有简写,但你可以使用try catch来避免链条条件......
var test = { a: '', b: { c: {} } }
try {
return test.b.c;
} catch (e) {
return undefined;
}
Cheerio:)
答案 1 :(得分:1)
您可以全力以赴为所有对象添加扩展程序。我知道人们倾向于使用Object原型来扩展对象功能,但我找不到比这更容易的东西。此外,它现在允许使用Object.defineProperty方法。
Object.defineProperty( Object.prototype, "has", { value: function( needle ) {
var obj = this;
var needles = needle.split( "." );
for( var i = 0; i<needles.length; i++ ) {
if( !obj.hasOwnProperty(needles[i])) {
return false;
}
obj = obj[needles[i]];
}
return true;
}});
现在,为了测试任何对象中的任何属性,您只需执行以下操作:
if( obj.has("some.deep.nested.object.somewhere") )
Here's a jsfiddle来测试它,特别是它包含一些jQuery,如果你直接修改Object.prototype会因为属性变得可枚举而中断。这应该适用于第三方库。
答案 2 :(得分:1)
可悲的是,在javascript中没有安全访问嵌套属性的简写。但是,一些函数库为您的问题提供了辅助函数(除了其他有用的东西)。示例(lodash):
return _.get(Config, 'Settings.Group.theThingIReallyWanted');
答案 3 :(得分:1)
您可以迭代给定的键并返回值或对象作为默认值。稍后返回最后一个属性。
function getValue(o, path) {
return path.reduce(function (o, k) {
return (o || {})[k];
}, o);
}
var o = { Config: { Settings: { Group: { theThingIReallyWanted: 42 } } } };
console.log(getValue(o, ['Config', 'Settings', 'Group', 'theThingIReallyWanted'])); // 42
答案 4 :(得分:0)
使用try catch块可能会有所帮助:
try {
return Config.Settings.Group.theThingIReallyWanted;
} catch(e) {
// something is undefined
}
没有简单的方法来递归检查是否定义了某个值。