【问题标题】:Using variables with nested Javascript object使用带有嵌套 Javascript 对象的变量
【发布时间】:2026-02-04 03:00:02
【问题描述】:

假设我有这个:

var a = { A : { AA : 1 }, B : 2 };

我有没有办法创建一个可以让我引用 AA 或 B 的变量?语法是什么样的?

// I know I can do this:    
a['B']; // 2
a['A']['AA']; // 1

// something like this?
var myRef = ???;
a[myRef]; 1 or 2 depending on myRef

如果没有,有什么更好的方法来获得我想要的东西?

【问题讨论】:

  • 上下文是什么?为什么不将a['A']['AA']a['B'] 的值分配给变量? myref 会随着时间而改变吗?但是不,这是不可能的,但this answer 可能会帮助你。
  • 我收到了一个嵌套的 JSON 响应,我希望能够按其各个字段进行排序。

标签: javascript


【解决方案1】:

不直接。

解决方案 1 - 使用对象展平

扁平化对象,拥有新对象var a = { 'A.AA' : 1; B : 2 };

compressing object hierarchies in JavaScriptFlattening a complex json object for mvc binding 获取它的javascript函数。

解决方案 2 - 编写密钥路径访问器

我可以看到 Eugen 已经解决了这个问题。 重新发布的代码审查版本:

function Leaf(obj,path) {
  path=path.split('.');
  var res=obj;
  for (var i=0;i<path.length;i++) res=res[path[i]];
  return res;
}

解决方案 3 - 使用评估

var x = eval("a." + myRef); // x will be 1 for myRef == "A.AA", 2 for "B"

请谨慎使用此解决方案,因为您可能会引入一些安全问题。更多的是好奇。

【讨论】:

  • eval 也很容易关闭优化并影响性能。
  • 谢谢。这使我找到了解决方案。我在 google 闭包(我正在使用)中查看了 Object 类型的访问器。他们有这个方法: goog.object.getValueByKeys(obj, Array | number | string | undefined) 所以 myRef 可以是 ['A', 'AA'] 或 ['B'] (如果我想始终传递一个数组) .无论如何,谢谢!
  • #solution #3 拯救了我的一天@Krizz 谢谢
【解决方案2】:

由于我也遇到了这个问题,所以我也为此写了一个单行实用程序(ES6):

const leaf = (obj, path) => (path.split('.').reduce((value,el) => value[el], obj))

例子:

const objSample = { owner: { name: 'Neo' } };
const pathSample = 'owner.name';

leaf(objSample, pathSample) //'Neo'

【讨论】:

  • 喜欢这个答案。一个小调整: const leaf = (obj, path) => (path.split('.').reduce((value,el) => value && value[el], obj))
【解决方案3】:
function Leaf(obj,path) {
  path=path.split('.');
  var res=obj;
  for (var i=0;i<path.length;i++) obj=obj[path[i]];
  return res;
}

叶子(a,'B')=2

Leaf(a,'A.AA')=1

根据您的需要使用错误处理等进行装饰。

【讨论】:

  • -1 这个 sn-p 存在足够多的问题,值得投反对票。除了length的拼写和split和length的大写外,它目前只是返回传入的原始对象。obj=obj[path[i]]应该是res=res[path[i]]jsfiddle.net/QuVdr
  • 应注意 - 试图让自己投票反对,但这不受 SO 的支持。由于历史原因未删除答案,因为它在已接受的答案中被引用。
【解决方案4】:

其实不是,因为 js 对象被视为属性包,而 a[X] 仅用于访问第一级属性...

但是您可以将逻辑 a['A']['AA']; // 1 包装在一个执行相同操作的函数中,就像这样

//WARN... no undefined check here => todo !
function _(o, path) {
  var tmp = o
  for (var i=0 ; i < path.length ; i++) {
    tmp = tmp[path[i]]
  }
  return tmp
}

var r = _(a, ['A', 'AA'])

这与其他答案几乎相同,但不同之处在于 dummy boy 创建包含点的对象属性名称时......就像var a = {"a.a" : 3 } 是有效的。

现在,借助 IndexedDB 在本地存储任何内容,这种问题可能会更频繁地发生......

【讨论】:

    【解决方案5】:

    使用 lodash _.get 函数,您可以使用点语法访问嵌套属性。

    节点服务器端示例:

    const _ = require('lodash'); 
    
    let item = { a: {b:'AA'}};
    
     _.get(item, 'a.b');
    

    【讨论】: