如何获取嵌套数组中的特定对象列表?

时间:2017-08-06 15:15:01

标签: javascript jquery wikipedia-api

如果我这样做:

var url="https://en.wikipedia.org/w/api.php?format=json&action=query&prop=categories&titles=Victory_Tests&callback=?";
$.getJSON(url,function(data){
    $.each(data, function(i, item) {
        console.log(item);
    });
});

控制台告诉我:

{pages: {…}}
   pages: 2347232: 
     categories: Array(8)0: 
      {ns: 14, title: "Category:Aftermath of World War II in the United Kingdom"}
      1: {ns: 14, title: "Category:All articles with unsourced statements"}
      2: {ns: 14, title: "Category:Articles with unsourced statements from August 2015"}
      3: {ns: 14, title: "Category:Articles with unsourced statements from March 2009"}
      4: {ns: 14, title: "Category:English cricket seasons from 1919 to 1945"}
      5: {ns: 14, title: "Category:History of Test cricket"}
      6: {ns: 14, title: "Category:Use British English from September 2011"}
      7: {ns: 14, title: "Category:Use dmy dates from September 2011"}
      length: 8
      __proto__: Array(0)
      ns: 0
      pageid: 2347232
      title: "Victory Tests"
    __proto__: 
  Object__proto__: 
 Object__proto__: Object

我需要获得所有categories

我尝试了item.categories

data.parse.pages.map(function(val){ 
    return val.categories[0]; 
}));

但它不对

3 个答案:

答案 0 :(得分:2)

你应该得到多个页面,如果你想聚合一切,那就这样做:

 var url="https://en.wikipedia.org/w/api.php?format=json&action=query&prop=categories&titles=Victory_Tests&callback=?";
$.getJSON(url,function(data){
    var categories = Object.values(data.query.pages).map( (i) => i.categories.map( (c) => c.title) );
    console.log(categories);
});

答案 1 :(得分:1)

假设已经返回了一个类似

的页面
Object.values(data.query.pages)[0].categories.map(cat=>cat.title.substr(9))

应该做的工作:

var url="https://en.wikipedia.org/w/api.php?format=json&action=query&prop=categories&titles=Victory_Tests&origin=*";
$.getJSON(url,function(data){
    var pages = Object.values(data.query.pages);
    if(pages.length === 1)
      console.log(pages[0].categories.map(cat => cat.title.substr(9)));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

根据您所需的浏览器支持,您可能需要Object.values的填充,例如https://github.com/tc39/proposal-object-values-entries/blob/master/polyfill.js

(注意更改后的网址,在我看来使用&origin=*代替&callback=?是更好的方法,因为它不会返回JSONP但是有效的JSON,也可以通过{{1 }和XMLHttpRequest/fetch。)

答案 2 :(得分:1)

使用API​​参数formatversion=2

var url="https://en.wikipedia.org/w/api.php?format=json&formatversion=2&action=query&prop=categories&titles=Victory_Tests&callback=?";
$.getJSON(url,function(data){
    console.log($.map(data.query.pages, function(val){ 
        return val.categories; 
    }));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

(还利用jQuery.map展平数组的能力。)

相关问题