使用嵌套Javascript对象的变量

时间:2012-01-05 21:52:07

标签: javascript

假设我有这个:

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

如果没有,那么什么是更好的方式来获得我在这里的目标?

5 个答案:

答案 0 :(得分:26)

不直接。

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

展平对象,以获得新对象var a = { 'A.AA' : 1; B : 2 };

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

Soution 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 - 使用eval

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

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

答案 1 :(得分:4)

由于我也遇到了这个问题,我还为此编写了一行实用程序(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'

答案 2 :(得分:2)

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

叶(一个, 'B')= 2

叶(一个, 'A.AA')= 1

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

答案 3 :(得分:1)

实际上没有,因为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'])

这与其他答案几乎相同,但区别在于虚拟男孩创建包含点的对象属性名称...类似var a = {"a.a" : 3 }有效。

现在,在IndexedDB的帮助下,现在可能更常出现这样的问题,以便在本地存储任何内容......

答案 4 :(得分:0)

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

节点服务器端示例:

gradlew