2017-02-16 33 views
1

我試圖從人口普查數據中使用node.js JSON.parse提取單個行和特定數據。使用node.js解析多維普查數據

const http = require('http'); 

function printStuff(statesInfo){ 

    const statesPopulations = `${statesInfo} This is all states info`; 
    console.log(statesPopulations); 
} 


const request = http.get(`http://api.census.gov/data/2013/acs5?get=NAME,B01001_001E&for=state:*&key=4c2f7253819e5491c78ff2c5ed541fe95943854c`,    

response => { 

    let body = ""; 


    console.log('Status Code:', response.statusCode); 

    response.on('data', data=> { 
     body += data.toString(); 

    }); 

    response.on('end',() => { 

     const statePop = JSON.parse(body); 

     const statesInfo = JSON.parse(body); 

     printStuff(statesInfo); 


    }) 
}); 

使用的console.log(體),結果顯示爲...

名稱,B01001_001E,州,阿拉巴馬州,4799277,01,阿拉斯加,720316,02,亞利桑那州,6479703, 04,阿肯色州,2933369,05,加利福尼亞州,37659181,06,科羅拉多州,51 19329,08,康涅狄格,3583561,09,特拉華.......

如果我使用console.dir(體),結果顯示爲...

[[NAME] [B01001] [狀態] [ '阿拉巴馬', '4799927', '01'], [ '阿拉斯加', '720316', '02']] ....

一路下降到波多黎各。我試圖抽出特定的東西,但我一直在樹屋使用的例子都設置得很好,整齊,你可以使用諸如profile.badges.length之類的漂亮的東西將特定的東西拉出來,但從我可以告訴的是,沒有這些東西被貼上標籤。我希望能夠說,把弗吉尼亞州的信息從那裏拉出來,或者是特拉華州。

+0

,'data'已經是有效的JSON。當你調用'data.toString()'時,你正在銷燬這個對象並把它變成一個字符串,所以你不能拔出你想要的東西。按原樣使用數據。 - 編輯 - 其實,沒關係..從請求中返回的數據被格式化爲一個奇怪的,無益的方式..使得很難得到你想要的。 –

回答

2

很可能您在Treehouse上看到的示例使用的對象的鍵值爲{Alabama: {...}},而不是您從census.gov [["Alabama", ...]]中返回的數組。

要訪問加利福尼亞州的人口,您需要從父級獲得第6個(索引5,因爲它基於0)嵌套數組。它看起來像這樣:

獲得加州陣列 console.log(statePop[5]); // outputs ["California","37659181","06"]

通過獲得加州數組中的第二項獲得美國加州的人口。 console.log(statePop[5][1]); // outputs "37659181"

如果你想要一個更人性化的版本(比如Treehouse的例子),你將不得不用數組中的鍵創建一個對象。你可以用類似lodash做到這一點很容易地或手動,像這樣:

var popByState = {}; 
// loop through each state and assign values to object keyed by the state name 
statePop.forEach(function(stateArr) { 
    popByState[stateArr[0]] = {population: stateArr[1]}; 
    // Ex stateArr = ["California","37659181","06"] 
    // stateArr[0] is the name of the state 
    // stateArr[1] is the population 
}); 
console.log(popByState.California.population) // outputs "37659181"; 

但你必須知道,在他們的名字,如「紐約」的空間狀態。您不能使用點符號來訪問這些(console.log(popByState.New York.population)),您必須在`response.on('data')`函數中使用括號console.log(popByState['New York'].population)

+0

幫助很多。我使用鍵來創建我自己的對象。我不知道這是可能的,上面的代碼真的幫助我。我想使它統一併適合於用戶輸入,我可以使用popByState ['StateHere']。population來代替所有狀態popByState.stateHere.population。 – Mike

+0

@Mike真棒,很高興它幫助!等一會兒,請接受答案。 – Ryan