【问题标题】:Is there a shorthand for nested objects reference? [duplicate]嵌套对象引用有简写吗? [复制]
【发布时间】:2017-05-05 00:07:15
【问题描述】:

在使用带有嵌套对象的 Javascript 时,我一直在做类似

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

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

【问题讨论】:

  • 不是语言的一部分,不。 edit 除非我忘记了一些新的语法技巧。
  • 其实不是,不过写起来没那么难
  • 如果这些属性中的任何一个都不存在,您是否希望它返回undefined?因为那是你会得到的。我喜欢尽可能返回空对象,例如:return (((Config || {}).Settings || {}).Group || {}).theThingIReallyWanted || {});
  • @lcepickle 我意识到这可能看起来不多,但我已经这样做了足够多的时间并且忘记了足够多的时间,所以我现在正在寻找一种速记方法。
  • @Chris 是的,我愿意。

标签: javascript shorthand


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

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

欢呼:)

【讨论】:

  • 也许我只需要编写一个执行此操作的函数,然后当我想执行此操作时,只需将引用作为变量传递即可。
  • 一个为你做try catch的函数?如果它值得节省 2-3 行代码 - 为什么不但是如果你在不同的函数中遇到 catch-block 可能你想返回不同的东西 - 这取决于你;)
【解决方案3】:

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

【讨论】:

  • 我喜欢你在这里所做的。老实说,我希望有一些新的 ES6 ES7 速记可以做到这一点。我不热衷于使用原型的想法,但这可能只是我的自然倾向。
【解决方案4】:

您可以迭代给定的键并默认返回值或对象。稍后返回最后一个属性。

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

【讨论】:

  • 我有一种感觉,我已经在某个地方看到了你的类似答案,但不确定:)
  • @Icepickle,你的感觉是对的,但问题略有不同。
【解决方案5】:

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

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

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

【讨论】:

  • 这可能会对性能产生不利影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多