使用嵌套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');