有时,使用字符串访问嵌套对象是可取的。简单的方法是第一个层次,例如
var obj = { hello: "world" };
var key = "hello";
alert(obj[key]);//world
但对于复杂的json,情况往往并非如此。随着json变得更加复杂,在json中查找值的方法也变得复杂。导航json的递归方法是最好的,如何利用递归取决于搜索的数据类型。如果涉及条件语句,则
json search
可以很好的使用工具。
如果要访问的属性已知,但路径很复杂,例如在这个对象中
var obj = {
arr: [
{ id: 1, name: "larry" },
{ id: 2, name: "curly" },
{ id: 3, name: "moe" }
]
};
你知道你想得到对象中数组的第一个结果,也许你想使用
var moe = obj["arr[0].name"];
但是,这将导致异常,因为没有具有该名称的对象的属性。能够使用它的解决方案是将对象的树方面展平。这可以递归地完成。
function flatten(obj){
var root = {};
(function tree(obj, index){
var suffix = toString.call(obj) == "[object Array]" ? "]" : "";
for(var key in obj){
if(!obj.hasOwnProperty(key))continue;
root[index+key+suffix] = obj[key];
if( toString.call(obj[key]) == "[object Array]" )tree(obj[key],index+key+suffix+"[");
if( toString.call(obj[key]) == "[object Object]" )tree(obj[key],index+key+suffix+".");
}
})(obj,"");
return root;
}
现在,复杂的物体可以变平。
var obj = previous definition;
var flat = flatten(obj);
var moe = flat["arr[0].name"];//moe
这里是一个
jsFiddle Demo
使用这种方法。