我有一个嵌套的Javascript对象,如
var data = { 'name': { 'heading': 'Name', 'required': 1, 'type': 'String' },
'profile': {
'age': { 'heading': 'Age', 'required': 0, 'type': 'Number' },
'phone': { 'heading': 'Phone', 'required': 0, 'type': 'String'},
'city': { 'heading': 'City', 'required': 0, 'type': 'String'},
},
'status': { 'heading': 'Status', 'required': 1, 'type': 'String' }
};
在这里,我可以访问data.profile.age.type或data.name.type这些字段。没有问题 如果我有动态变量名称,我可以访问如下。再一次,没问题。
f = 'profile'; data[f].age.type
但是,我在这里有变量名称,如'name','profile.age','profile.city'等,显然我无法访问它们,因为f ='profile.age';数据[f] .type不起作用。
有人能指导我如何以最直接和最简单的方式访问它们(获取/设置)吗?
注意:我试过这个,它适用于get。
data.get = function(p) { o = this; return eval('o.'+p); };
f = 'profile.age'; data.get(f).name;
虽然设置似乎不够简单。如果有更好的获取和设置解决方案,请告诉我。
答案 0 :(得分:8)
您可以嵌套括号:
var a = 'name', b = 'heading';
data[a][b]; // = `Name`
答案 1 :(得分:7)
除非绝对必要,否则请勿使用eval
。 :)至少在这种情况下,有更好的方法 - 你可以将嵌套的名称拆分成单独的部分并迭代它们:
data.get = function(p) {
var obj = this;
p = p.split('.');
for (var i = 0, len = p.length; i < len - 1; i++)
obj = obj[p[i]];
return obj[p[len - 1]];
};
data.set = function(p, value) {
var obj = this;
p = p.split('.');
for (var i = 0, len = p.length; i < len - 1; i++)
obj = obj[p[i]];
obj[p[len - 1]] = value;
};
答案 2 :(得分:2)
也许是一个函数,它接受你感兴趣的属性的路径,并将其分解为表示属性的标记。这样的事情(当然这非常粗糙):
data.get = function(path) {
var tokens = path.split('.'), val = this[tokens[0]];
if (tokens.length < 2) return val;
for(var i = 1; i < tokens.length; i++) {
val = val[tokens[i]];
}
return val;
}
示例:
var f = 'one.two';
var data = { one: {two:'hello'}};
data.get = /* same as above */;
var val = data.get(f);
答案 3 :(得分:1)
一种访问/设置嵌套值的干净方法是在ES6中使用reduce
:
const x = ['a', 'b', 'c'], o = {a: {b: {c: 'tigerking'}}}
// Get value: "tigerking"
console.log(x.reduce((a, b) => a[b], o))
// Set value:
x.slice(0, x.length-1).reduce((a, b) => a[b], o)[x[x.length-1]] = 'blossom'
console.log(o) // {a: {b: {c: 'blossom'}}}
因此,您可以先使用'profile.age'
将变量'profile.age'.split('.')
转换为数组,然后使用上述方法。
答案 4 :(得分:0)
这使用jquery.each()函数使用字符串变量遍历json树,该变量可能包含也可能不包含一个或多个“。”。您也可以传入一个数组并省略.split();
pathString =类似“person.name”
jsonObj =类似{“person”:{“name”:“valerie”}}。
function getGrandchild(jsonObj, pathString){
var pathArray = pathString.split(".");
var grandchild = jsonObj;
$.each(pathArray, function(i, item){
grandchild = grandchild[item];
});
return grandchild;
};
返回“valerie”