Javascript:查找JSON中出现值的次数

时间:2013-11-25 16:36:37

标签: javascript json filter

如果这是一个愚蠢的问题,我想原谅自己,但我无法弄清楚这里出了什么问题。我是d3的新手,说实话Javascript是一个整体。我有一个json文件,如下所示:

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

我试图弄清楚我的JSON文件中出现“HAVO”,“MBO”和“VWO”值的频率。为此,我编写了以下代码:

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

    });

我收到提醒,“你好,[对象对象]”。但根据我的控制台json [i]未定义。为什么突然之间没有定义,而它的警报工作得非常好?

我需要发生的事情(在此示例中)是控制台为每个值记录1。

2 个答案:

答案 0 :(得分: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;
}, {});

答案 1 :(得分: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问题。这是另一种方法。