2013-11-25 60 views
1

如果這是一個愚蠢的問題,我想原諒自己,但我無法弄清楚這裏出了什麼問題。我對d3相當陌生,誠實地說Javascript是一個整體。我有一個JSON文件,該文件是這樣的:Javascript:查找JSON值發生的次數

[{"plaats":"AMSTERDAM","geboortejaar":1990,"vooropleiding":"MBO"}, {"plaats":"GENK","geboortejaar":1987,"vooropleiding":"HAVO"}, {"plaats":"JOPPE","geboortejaar":1992,"vooropleiding":"VWO"}] 

我試圖找出如何常值「普通中等教育」,「MBO」和「VWO」發生在我的JSON文件。爲此,我寫了下面的代碼:

var svgHeight = 400; 
var svgWidth = 400; 

var svg = d3.select("#pieChart") 
    .append("svg") 
    .attr("height", svgHeight) 
    .attr("width", svgWidth); 

d3.json("propedeuse.json", function (error, json) { 

    alert("Hello, " + json[2]); 

    var VWO = 0, 
     HAVO = 0, 
     MBO = 0; 

    for (var i = 0; i <= json.length; i++) { 

     if (json[i].vooropleiding == "VWO") { 
      VWO++; 
     } 

     else if (json[i].vooropleiding == "HAVO") { 
      HAVO++; 
     } 

     else { 
      MBO++; 
     } 
    } 

    svg.append("p") 
    .text(HAVO); 

    console.log("MBO: " + HAVO); 
    console.log("HAVO: " + HAVO); 
    console.log("VWO: " + VWO); 

    }); 

我確實收到警報「Hello,[object Object]」。但根據我的控制檯json [i]是未定義的。它是如何突然未定義的,而它在警報中工作得很好?

我需要發生的事情(在本例中)是控制檯爲每個值記錄1。

+1

上面的示例和代碼不能完整/正確。數組中只有3個元素,所以'json [16]'是未定義的。警報應該說「你好,未定義」。沒有看到實際的數據,這只是一個猜測,但也許是你的數組元素之一缺少'vooropleiding'屬性(或有拼寫錯誤)? –

+0

@StephenThomas這是我的不好,我使用的實際json文件中有282個元素,現在我只用了三個例子。感謝您告訴我,我現在編輯它。 – Yonker

回答

1

http://jsfiddle.net/jL2We/1/

var data = [{"plaats":"AMSTERDAM","geboortejaar":1990,"vooropleiding":"MBO"}, {"plaats":"GENK","geboortejaar":1987,"vooropleiding":"HAVO"}, {"plaats":"JOPPE","geboortejaar":1992,"vooropleiding":"VWO"}]; 

// Inside d3.json, your "json" variable is equivalent to this "data" 

var vwo = data.filter(function(d) { return d.vooropleiding === "VWO"; }).length, 
    havo = data.filter(function(d) { return d.vooropleiding === "HAVO"; }).length, 
    mbo = data.filter(function(d) { return d.vooropleiding === "MBO"; }).length; 

document.getElementById("vwo").innerText = vwo; 
document.getElementById("havo").innerText = havo; 
document.getElementById("mbo").innerText = mbo; 

我同意@Jonah。這只是一個JavaScript問題。這是另一種方法。

+0

非常感謝!我當時希望能有一種過濾功能,我只是沒有想到它會被這樣調用。但是,這對我有很大的幫助。 – Yonker

+1

它是ECMAScript 5中的標準,這意味着[在IE <9](https://github.com/kriskowal/es5-shim)中小心。有一個'jQuery.grep'函數可以爲那些舊瀏覽器擴展功能,或使用[ES5 shim](https://github.com/kriskowal/es5-shim)。 – Andrew

+1

另外,您已經知道如何將JSON源代碼轉換爲數組(D3就是爲您做的),所以如果您將問題標題更改爲「如何查找數字時間值出現在對象數組中「等等。得到那些互聯網點! – Andrew

1

你的問題似乎不是d3。這真的只是一個JavaScript問題。這將返回一個對象與所需的罪狀:

var json = [{"plaats":"AMSTERDAM","geboortejaar":1990,"vooropleiding":"MBO"}, {"plaats":"GENK","geboortejaar":1987,"vooropleiding":"HAVO"}, {"plaats":"JOPPE","geboortejaar":1992,"vooropleiding":"VWO"}]; 

var answer = json.reduce(function(prev, cur) { 
    var val = cur["vooropleiding"]; 
    prev[val] = (prev[val] || 0) + 1; 
    return prev; 
}, {}); 
+0

感謝您抽出時間幫助。 – Yonker