我有一个包含对象和数组的嵌套数据结构。我如何提取信息,即访问特定或多个值(或键)?例如:var data = { code: 42, i...
我有一个包含对象和数组的嵌套数据结构。如何提取信息,即访问特定值或多个值(或键)?
例如:
var data = {
code: 42,
items: [{
id: 1,
name: 'foo'
}, {
id: 2,
name: 'bar'
}]
};
我如何访问 name
中的第二项 items
?
有时,使用字符串访问嵌套对象是可行的。简单的方法是第一层,例如
var obj = { hello: "world" };
var key = "hello";
alert(obj[key]);//world
但对于复杂的 JSON,情况通常并非如此。随着 JSON 变得越来越复杂,在 JSON 中查找值的方法也变得越来越复杂。使用递归方法来浏览 JSON 是最好的,而如何利用该递归将取决于要搜索的数据类型。如果涉及条件语句, JSON 搜索 可能是一个很好的工具。
如果访问的属性已经已知,但是路径很复杂,例如在此对象中
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 演示