是否有 shorthand 用于嵌套对象引用?

Is there a shorthand for nested objects reference?

在将 Javascript 与嵌套对象一起使用时,我一直在做

之类的事情
const configDoc = Config && Config.Settings && Config.Settings.Group && 
    Config.Settings.Group.theThingIReallyWanted

是否有 shorthand 用于获取嵌套引用?

afaik 没有 shorthand 但您可以使用 try catch 来避免链接条件...

var test = { a: '', b: { c: {} } }

try {
  return test.b.c;
} catch (e) {
  return undefined;
}

干杯 :)

使用 try catch 块可能会有所帮助:

try {
    return Config.Settings.Group.theThingIReallyWanted;
} catch(e) {
    // something is undefined
}

没有简单的方法来递归检查是否定义了某个值。

您可以全力以赴,为所有对象添加扩展。我知道人们倾向于不赞成使用对象原型来扩展对象功能,但我发现没有比这样做更容易的事情了。另外,现在允许使用 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 会因为 属性 变得可枚举而中断。这应该适用于第 3 方库。

遗憾的是,javascript 中没有 shorthand 可以安全访问嵌套属性。然而,一些函数库为您的问题提供了帮助函数(除了其他有用的东西)。示例 (lodash):

return _.get(Config, 'Settings.Group.theThingIReallyWanted');

您可以迭代给定的键和 return 默认值或对象。后来 return 最后 属性.

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