【问题标题】:(Terminology) How to refer to a variable within a variable? [duplicate](术语)如何在变量中引用变量? [复制]
【发布时间】:2017-03-18 09:52:15
【问题描述】:

我需要澄清一些术语,因为现在我的项目在引用变量时使用了一些术语。

考虑这样定义的对象:

var anObject = {
    a: {
        value1: 1337,
        value2: 69,
        value3: "420 man"
    }
}

如果我错了,请纠正我,但我假设 aobject anObject属性

但是在anObject的上下文中,我应该如何引用value1呢?它也是“财产”吗?

我问的原因是我需要创建函数来访问对象的“变量中的变量”。像这样:

function getProperty(name) {
    // ...
}

var theValueImLookingFor = getProperty("a.value1");

如果这个问题不适合 Stack Overflow,请让我知道我应该在哪里回答这个问题。谢谢

编辑:我不是在问如何访问嵌套变量,我是在问如何在术语中引用它

鉴于value1a 的属性,而anObjectanObject 的属性。 value1anObject 是什么?它是“财产财产”吗?我的意思不是听起来轻率,但我该怎么称呼它?

【问题讨论】:

  • 请注意,这里根本没有 JSON。 JSON 是一种文本数据格式。你所拥有的只不过是 JavaScript 对象。
  • 对象有属性,那些属性可以是对象,有属性,可以是对象,...等等
  • @Cerbrus 是的,这就是我正在考虑的。谢谢。 (当我输入该评论时,我对问题的看法尚未更新。)
  • @Birger 我不知道通过对象图引用路径的“标准”方式。在离散数学中,它有时被称为“Gorn 地址”,但我怀疑很少有人会理解。

标签: javascript terminology


【解决方案1】:

就像aanObject 的属性一样,value1 也是a 的属性。

因此您可以使用以下方式访问它:

anObject.a.value1

就是这样。长答案是,这可以分解为以下代码:

const innerObject = anObject.a;
const result = innerObject.value1;

请注意,在 JavaScript 中,对象只不过是键值对的列表,即字典。您可以使用任何数据类型作为值,甚至是另一个对象,因此您最终会得到嵌套对象 - 这正是您所拥有的。

所以对于你所说的函​​数,你需要做的就是将给定的字符串用它的分隔符字符分割,比如.,然后递归地遍历对象树,直到你到达你想要的地方。

请注意,例如在 npm 上已经有现成的模块可以做到这一点,例如nested-keys(随便命名一个,还有很多其他模块可以完成相同或至少类似的任务)。

即使是非常常用的库(如 Lodash)也提供此功能,因此您很有可能不需要自己编写代码,但可以使用这种现成的功能。例如,您可以使用 [get](https://lodash.com/docs/4.16.6#get] of Lodash:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// => 3

_.get(object, ['a', '0', 'b', 'c']);
// => 3

_.get(object, 'a.b.c', 'default');
// => 'default'

(此示例代码取自 get 上链接的 Lodash 文档。)

如果您仍想创建自己的实现,查看 Lodash 的源代码可能是一个很好的起点。

更新

关于您的编辑,我认为没有正式的术语。您可以将其称为嵌套属性,或子对象的属性。我想我宁愿像你最初那样描述:value1 是一个对象的属性,它是anObject 的属性。这并不优雅,但在技术上是正确的,正如我所说,我认为没有更好的(官方)术语。

【讨论】:

  • 我认为 OP 想知道如何在给定对象图中叶值的“路径”的字符串表示形式下检索该值。当属性名称固定时,您的答案有效,但情况并非总是如此。
  • 对。我更新了我的答案以更好地适应这个问题。
  • 请看我的编辑,我不是问如何访问变量。我在问如何引用它,或者如果我要描述它,该怎么称呼它......
  • @GoloRoden 你的回答很好,但你错过了我的问题的重点。我非常清楚如何访问变量中的变量。但我不知道该怎么称呼它。因此,我的问题中的(Terminology) 标记似乎完全被忽略了......
  • @Birger 感谢您澄清这一点!很抱歉,我首先把你的问题弄错了。我现在添加了一个小更新。
猜你喜欢
  • 2011-06-11
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2011-06-16
  • 2013-02-16
  • 1970-01-01
  • 2015-08-17
相关资源
最近更新 更多