使用嵌套Javascript对象的变量

Ben*_*ynn 13 javascript

假设我有这个:

var a = { A : { AA : 1 }, B : 2 };
Run Code Online (Sandbox Code Playgroud)

有没有办法让我创建一个可以让我引用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
Run Code Online (Sandbox Code Playgroud)

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

Kri*_*izz 29

不是直接的.

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

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

请参阅在JavaScript中压缩对象层次结构 或为mvc绑定展平复杂的json对象以获取它的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;
}
Run Code Online (Sandbox Code Playgroud)

解决方案3 - 使用eval

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

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


小智 6

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

const leaf = (obj, path) => (path.split('.').reduce((value,el) => value[el], obj))
Run Code Online (Sandbox Code Playgroud)

例:

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

leaf(objSample, pathSample) //'Neo'
Run Code Online (Sandbox Code Playgroud)

  • 喜欢这个答案。一个小调整: const leaf = (obj, path) =&gt; (path.split('.').reduce((value,el) =&gt; value &amp;&amp; value[el], obj)) (2认同)