2013-07-17 40 views
0

我目前正試圖在使用D3的波多黎各地圖上創建一個choropleth。使用Scott Murray's Example on Choropleths,我試圖將數據綁定到波多黎各的每個城市。我有一個佔位符空對象來保存數據從CSV被送入像這樣:JavaScript中的對象卡在csv文件的最後一行

var properties = {}; 

然後,我開始閱讀行CSV文件。我將相應的值分配給如下一些變量:

properties.dataID = parseFloat(data[i].id); 
properties.dataMunic_Total = parseFloat(data[i].municipio_total); 
//etc. 

所有罰款和丹迪。我CONSOLE.LOG檢查數據是否被正確地保存:

console.log(properties.dataID); 
//Displays 1, which is correct. 

然而,當我嘗試訪問整個對象:

console.log(properties); 

它只顯示CSV文件的最後一行。我將第一個for循環內的最後一個console.log()語句立即運行,在將數據分配給對象的屬性後立即運行,並且每次循環遍歷console.log()時,它都只顯示CSV文件的最後一行。

當我嘗試將對象屬性分配給我的地圖對象(城市)時,它分配的所有內容都是CSV文件的最後一行。所以我試着單獨設置它們,看起來似乎有效。然而,JavaScript的抱怨,酒店沒有在對象存在:

obj.geometries[j].properties.year[properties.dataYear - 2000].id = properties.dataID; 
Uncaught TypeError: Cannot read property 'id' of undefined 

我試圖對其進行初始化,好像它是一個新的變量:

var obj.geometries[j].properties.year[properties.dataYear - 2000].id = properties.dataID; 

但後來我得到了控制檯上回:

Uncaught SyntaxError: Unexpected identifier 

除了語法錯誤,我認爲這主要是由於我的附加陣列每個城市,所以我可以持有不同的組每年數據的事實......不過我還是要說不明白JavaScript爲什麼會這樣。

我的問題是:爲什麼我的對象的行爲是這樣的? d3.csv有問題嗎?難道我做錯了什麼?

回答

1

如果要存儲多個屬性,則需要使用數組(即列表)。在您使用的代碼中,您一次只創建一個變量properties,而不保存之前創建的引用。也就是說,在循環的每一次迭代中,您都在創建一個新對象,但是失去了舊對象。

如果您將properties聲明爲數組,然後在循環中追加新的屬性對象,稍後可以引用它們並使用它們繪製地圖。代碼看起來像這樣。

var properties = []; 
for(var i = 0; i < data.length; i++) { 
    var property = {}; 
    property.dataID = parseFloat(data[i].id); 
    property.dataMunic_Total = parseFloat(data[i].municipio_total); 
    // ... 
    properties.push(property); 
} 

建立這樣的數據後,你應該能夠繼續作爲例子說明。

+0

非常感謝您的回答。我必須按照我分配數據的方式修復其他內容。我沒有正確訪問對象的年份,所以它會繼續吐出未定義的。 – shredmasteryjm

相關問題