2017-08-06 38 views
0

如果我運行此:我將如何獲得嵌套數組中特定對象的列表?

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]; 
})); 

但它不是右邊

回答

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

(注意改變URL,在使用&origin=*代替&callback=?是更好的辦法,因爲它那麼不返回JSONP但有效的JSON,這也可以通過XMLHttpRequest/fetchJSON.parse消耗我的意見。)

+0

所以'的console.log(Object.values(data.query.pages)[0] .categories.map( cat => cat.title.substr(9)));'會給我每一個? –

+0

也json返回罰款,沒有錯誤 –

+0

返回第一頁的類別標題數組。我將刪除回調參數,否則返回一個不必要的'/ ** /(...)',嚴格來說,它不再是JSON,儘管'getJSON'仍然解析它。 – Stephan

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); 
}); 
+0

不是頁面每個循環都只有一個,所以我只需要那個頁面的類別,並且抓取他們爲每一個新的頁面 –

+0

https://jsfiddle.net/jikupin/pz3ce0o6/1383/ –

+0

改變,再試一次 –

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變平陣列的能力。)

+0

雖然代碼片段會事實上,''formatversion = 2'也可以工作,因爲'jQuery.map'可以像數組一樣處理對象。 – Tgr

+0

非常感謝,我在聊天中給你打電話,你能給我一點時間嗎?堆積如山,瘋狂地一點點 –

相關問題