2014-01-20 38 views
0

我想使用D3(請參見截圖)訪問下面的json對象中的vis元素,但無法這樣做。我可以使用類似於下面的代碼訪問鍵和值的元素,沒有任何問題:D3嘗試訪問json對象中的vis元素

console.log(d.key); 

但是,這並不工作(我得到一個未定義的錯誤):

console.log(d.vis); 

任何想法,我是什麼做錯了?謝謝!

json obj http://i42.tinypic.com/21cgtaa.png

下面是一些代碼片段:

var nested = d3.nest().key(function(d) { return d._id.stream; }) 
    .entries(data.result); 

var stream = main.selectAll(".stream") 
    .data(nested) 
    .enter().append("g") 
    .attr("class", "stream");  

    stream.append("rect") 
    .attr("height",10) 
    .attr("width", 25) 
    .attr("x",width-215) 
    .attr("y", function(d,i) { return height-400 + (i*40); }) 
    .attr("stroke", function(d) { return color(d.key);}) 
    .attr("fill",function(d) { 
     if(d.vis=="1") { 
     return color(d.key); 
     } 
     else { 
     return "white"; 
     } 
    }) 
    .on("click", function(d) { 
    console.log(d); 
    console.log(d.vis); // undefined 
    if(d.vis=="1") { 
     d.vis="0"; 
     } 
     else{ 
     d.vis="1"; 
     } 
    }); 
+1

聽起來像它應該工作。你可以發佈一些代碼來重現問題嗎? –

+0

增加了一些代碼。我使用以下示例:http://mpf.vis.ywng.cloudbees.net/ – JamesE

+0

沒有任何基礎數據的概念,「d」的屬性對任何試圖提供幫助的人都是完全不透明的。在您使用的數據中,「vis」可能完全不確定。 – cmonkey

回答

1

它看起來像正在發生以下。點擊處理函數被執行。在裏面,你正在記錄d.vis,這是未定義的。緊接着的代碼檢查d.vis是否具有特定值,否則將其設置爲「1」。這個「其他」包括未定義的情況。

因此,在處理程序執行後,被設置爲全部d。您正在使用的調試器顯示該變量的值,其中console.log()語句後被修改。也就是說,在您打印d時,d.vis確實未定義。但是你之後立即設置它,這就是你在控制檯中得到的。

當打印日誌時,日誌不會記錄變量的狀態,但會顯示當前的版本,在這種情況下,該版本已設置d.vis

+0

當然,總是有意義的。謝謝。 – JamesE

0

注意數據結構: 請參閱fetchData.js,除了priceList和name之外,還應該有vis元素來決定是否顯示曲線。

//The main data array of the graph 
//format: 
//data2 (List of fundObj) 
// fundObj (Name, priceList) 
//  Name 
//  vis 
//  priceList (List of priceItem) 
//   priceItem (date, price) 

所以,要明確什麼是「d」的代碼,這一切都取決於你傳遞給呼叫的數據:

var fund = focus.selectAll(".fund") 
     .data(data2) 
     .enter().append("g") 
     .attr("class", "fund"); 

這裏DATA2是原始數據,你可以使用其他結構,但需要修改「d」的地方的一些代碼.....