我正在使用维基百科媒体API进行项目。我正在使用Jquery查询API。检查Chrome中的开发者控制台时,以下请求有效,如此代码集http://codepen.io/jowze/pen/NNZNKY/?editors=1010
中所示$.ajax({
url:'https://en.wikipedia.org/w/api.php',
data: { action : 'query', generator: 'search', gsrnamespace : '0', gsrlimit : '10', prop : 'extracts', pilimit: 'max',
exintro: '', explaintext: '', exsentences: '1' , exlimit: 'max' , gsrsearch: 'Richard Feynman', format: 'json'},
dataType: 'jsonp',
success: function (x) {
var result = x.query.pages;
for (var i in result) {
var item = result[i].pageid;
console.log(item);
}
}
});
当使用for ... in循环遍历结果时,此代码有效。当编写尝试访问结果变量的相同代码时,控制台会打印Uncaught TypeError: Cannot read property 'pageid' of undefined
success: function (x) {
var result = x.query.pages;
var item = result[0].pageid;
console.log(item);
}
});
知道为什么会这样吗?为什么无法通过result[0]
,result[1]
,...,result[n]
访问JSON对象的每个键?
答案 0 :(得分:0)
结果对象的键是非常大的整数(不是0,1,2)。 results
不是数组,它是一个JS对象。因此,指数不以0开头。
for (var i in result)
..迭代对象中的每个键,因此result[i]
有效。请参阅MDN以供参考。
答案 1 :(得分:0)
我认为你可以记录这样的结果:
success: function (x) {
var result = x.query.pages;
var item = result[0].pageid;
console.log(result,result[0]);
}
});
结果[0] 如果它是一个项目
,则必须有一个名为 foo 的密钥答案 2 :(得分:0)
在您的示例中,您尝试执行result[0]
,它读取名为result
的数组的第一个元素。由于results
是一个对象,因此result[0]
表示您正在尝试访问result.0
,在这种情况下并不总是存在。
使用result[0].pageid
,您尝试访问result.0.pageid
,如果result.0
不存在,这显然不会存在。因此,您将收到错误" Uncaught TypeError:无法读取属性&page;'未定义"。
答案 3 :(得分:0)
只需按照以下代码中的说明放置一些控制台日志,您就会明白为什么会遇到此错误。
$.ajax({
url:'https://en.wikipedia.org/w/api.php',
data: { action : 'query', generator: 'search', gsrnamespace : '0', gsrlimit : '10', prop : 'extracts', pilimit: 'max', exintro: '', explaintext: '', exsentences: '1' , exlimit: 'max' , gsrsearch: 'Richard Feynman', format: 'json'},
dataType: 'jsonp',
success: function (x) {
var result = x.query.pages;
console.log("== What is the type of result : " + typeof(result)); //Object
console.log("Complete Result : " + JSON.stringify(result));
for (var i in result) {
console.log("Property type for object result :" + typeof(i)); //String
var item = result[i].pageid;
var title = result[i].title;
var extract = result[i].extract;
}
}
});
所以,你在这里要做的是通过索引访问非数字对象属性,这是不可能的。如果您想这样做,那么您可以了解更多相关信息here。