如何访问嵌套的JSON数据
假设我有像json数据
data = {"id":1, "name":"abc", "address": {"streetName":"cde", "streetId":2 } }  现在我正在从这个JSON数据像fields = ["id", "name", "address.streetName"] 
 我怎样才能以最有效的方式访问给定json数据的第三个字段( address.streetName )?  data.fields[2]不起作用 
 一种可能性是我使用for循环构造data[address][streetName]string,并对此进行评估,但有没有这样做的有效方法? 
说实话,我不明白你的问题。 JSON已经构造出来了,为什么你需要改变结构呢?
在你的情况下,我会访问它如下:
 data.address.streetName; 
如果有的话,你想要的是遍历数据,你需要:
 function traverse_it(obj){ for(var prop in obj){ if(typeof obj[prop]=='object'){ // object traverse_it(obj[prop[i]]); }else{ // something else alert('The value of '+prop+' is '+obj[prop]+'.'); } } } traverse_it(data); 
更新
阅读下面后,这个用户需要什么似乎更明显。 给定属性名称作为一个string,他/她想访问该对象。
 function findProp(obj, prop, defval){ if (typeof defval == 'undefined') defval = null; prop = prop.split('.'); for (var i = 0; i < prop.length; i++) { if(typeof obj[prop[i]] == 'undefined') return defval; obj = obj[prop[i]]; } return obj; } var data = {"id":1,"name":"abc","address":{"streetName":"cde","streetId":2}}; var props = 'address.streetName'; alert('The value of ' + props + ' is ' + findProp(data, props)); 
 如果使用lodash (一个非常受欢迎的实用程序库),则可以使用_.get() 。 
例如
 var data = { "id":1, "name": "abc", "address": { "streetName": "cde", "streetId":2 } } _.get(data, 'address.streetName'); // 'cde' _.get(data, ['address', 'streetName']); // 'cde' 
 如果涉及数组,则可以使用像'address[0].streetName'这样'address[0].streetName'stringpath。 
例如
 var data = { "id":1, "name": "abc", "addresses": [ { "streetName": "cde", "streetId": 2 }, { "streetName": "xyz", "streetId": 102 }, ] } _.get(data, 'addresses[0].streetName'); // cde _.get(data, [address, 1, streetName]); // xyz 
 在内部,它使用toPath()函数将stringpath(例如address.streetName )转换为数组(例如['address', 'streetName'] ),然后使用函数访问对象内给定path的数据。 
 其他类似的实用函数包括_.set()和_.has() 。 去看一下。 
 长话短说,可以使用数组表示法object[property]而不是object.property ; 这在键包含特殊字符时特别有用: 
 var data = { "id": 1, "name": "abc", "address": { "streetName": "cde", "streetId": 2 } } data.address.streetName; // (1) dot notation data["address"]["streetName"]; // (2) array notation var field = "streetName"; data["address"][field]; // (3) variable inside array notation var fields = "address.streetName".split("."); data[fields[0]][fields[1]]; // (4) specific to your question 
 在使用之前,可以使用typeof运算符来检查属性是否存在: 
 typeof data["address"]["streetName"]; // returns "string" typeof data["address"]["foobarblah"]; // returns "undefined" 
 你的datavariables没有fields属性,这就是为什么data.fields[2]不起作用。 我认为你在那里试图做的是data[fields[2]] ,这将适用于一个简单的对象,但你不能索引到一个复杂的对象。 
 你可以通过这种方式访问它的data.address.streetName 
JavaScript的:
 function getProperty(json, path) { var tokens = path.split("."); var obj = json; for (var i = 0; i < tokens.length; i++) { obj = obj[tokens[i]]; } return obj; } var data = { id: 1, name: "abc", address: { streetName: "cde", streetId: 2 } }; var fields = ["id", "name", "address.streetName"]; for (var i = 0; i < fields.length; i++) { var value = getProperty(data, fields[i]); console.log(fields[i] + "=" + value); } 
输出:
 id=1 name=abc address.streetName=cde