是否有嵌套对象引用的简写?

时间:2017-05-04 15:38:00

标签: javascript shorthand

在使用嵌套对象的Javascript时,我经常做像

这样的事情
const configDoc = Config && Config.Settings && Config.Settings.Group && 
    Config.Settings.Group.theThingIReallyWanted

是否有获取嵌套引用的简写?

5 个答案:

答案 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
}

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