假设我有这个:
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
如果没有,那么什么是更好的方式来获得我在这里的目标?
答案 0 :(得分:26)
不直接。
展平对象,以获得新对象var a = { 'A.AA' : 1; B : 2 };
。
参见compressing object hierarchies in JavaScript 或Flattening a complex json object for mvc binding获取javascript函数。
我可以看到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;
}
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