使用嵌套Javascript对象的变量

使用嵌套Javascript对象的变量,javascript,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 如果没有,那么有什么更好的方法来获得我在这里想要的呢?函数叶(

假设我有这个:

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
如果没有,那么有什么更好的方法来获得我在这里想要的呢?

函数叶(obj,path){
function Leaf(obj,path) {
  path=path.split('.');
  var res=obj;
  for (var i=0;i<path.length;i++) obj=obj[path[i]];
  return res;
}
path=path.split('.'); var-res=obj; 对于(var i=0;i不直接

解决方案1-使用对象展平 展平对象,以拥有新对象
var a={'a.AA':1;B:2};

看 或者获取它的javascript函数

Soution 2-写入密钥路径访问器 我看得出来,它已经被欧根处理过了。 重新发布的代码已审核版本:

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

使用此解决方案时要小心,因为您可能会引入一些安全问题。这更令人好奇。

实际上不是,因为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'])
//警告…此处没有未定义的检查=>待办事项!
函数uo(路径){
var tmp=o
对于(变量i=0;i
这与其他答案几乎相同,但不同之处在于,当dummy boy创建包含点的对象属性名称时……例如
var a={“a.a”:3}
是有效的


现在,在IndexedDB的帮助下,在本地存储任何东西时,这种问题可能会更频繁地出现…

因为我也遇到了这个问题,我还为此编写了一行util(ES6):

例如:

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

leaf(objSample, pathSample) //'Neo'

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

节点服务器端示例:

const _ = require('lodash'); 

let item = { a: {b:'AA'}};

 _.get(item, 'a.b');

什么是上下文?为什么不为
a['a']['AA']
a['B']赋值
到一个变量?myref是否会随着时间而变化?但不,这不可能,但可能会对您有所帮助。我收到一个嵌套的JSON响应,我希望能够按其各个字段进行排序。eval也会倾向于关闭优化并影响性能。谢谢。这让我找到了我的解决方案。我在google closure(我正在使用)中查找对象类型的访问器。它们有以下方法:goog.Object.getValueByKeys(obj,Array | number | string | undefined),因此myRef可以是['A'、'AA']或['B'](如果我想一致地传递数组)。无论如何,谢谢!#解决方案#3拯救了我的一天@Krizz谢谢-1这段代码有足够多的问题需要进行下一次投票。除了长度的拼写以及拆分和长度的上限之外,它目前只返回传入的原始对象。
obj=obj[path[i]
应该是
res=res[path[i]]
.Duely noted-我曾试图投票否决自己,但SO不支持这一点。由于历史原因,答案没有被删除,正如被接受的答案中所引用的那样。我喜欢这个答案。一个小小的调整:const leaf=(obj,path)=>(path.split('.')。reduce((value,el)=>value&&value[el],obj))
const objSample = { owner: { name: 'Neo' } };
const pathSample = 'owner.name';

leaf(objSample, pathSample) //'Neo'
const _ = require('lodash'); 

let item = { a: {b:'AA'}};

 _.get(item, 'a.b');