在d3.js中的queue()中对JSON数据进行分组和计数

时间:2019-02-24 13:18:45

标签: javascript json d3.js

我正在尝试更改提供D3地图的json文件的格式。原始消息来源是palewire的World Choropleth

编辑:工作代码要感谢Plunker中的以下回答: http://embed.plnkr.co/JYTATyrksAg3OJ0scHAp/

原始json是嵌套格式,其中每个值都有一个计数:

  {
    "id": "IQ-G02-D009",
    "rate": "1"
  },
  {
    "id": "IQ-G05-D030",
    "rate": "4"
  },
  {
    "id": "IQ-G07-D047",
    "rate": "5"
  }
]

新的json将使用平面格式,例如:

[
  {
    "id": "IQ-G02-D009"
  },
  {
    "id": "IQ-G05-D030"
  },
  {
    "id": "IQ-G05-D030"
  },
  {
    "id": "IQ-G05-D047"
  },
  {
    "id": "IQ-G07-D047"
  }
]

使用汇总和嵌套功能似乎是获得与前一个相似形式的新json的前进方式,但是却被困于在queue()中实现它们。

汇总应该在.defer级别上实现:

queue()
    .defer(d3.json, "map.json")
    .defer(d3.json, "data.json")
    .await(ready);

我可以直接在队列中使用嵌套和汇总功能吗?

1 个答案:

答案 0 :(得分:0)

您有一些错字对您不利。正如cal_br_mar所说,您的问题的一般答案是:加载数据时套用嵌套并汇总。所以:

queue()
  .defer(d3.json, "map.json")
  .defer(d3.json, "data.json")
  .await(ready)

function ready(error, country, activities) {
   activities = d3.nest()
     .key(function(d) {
       return d.id;
     })
     .rollup(function(v) {
       return v.length;
     })
     .entries(activities);  
}

您在最后一行输入了错字:应该是activities,而不是expenses(我猜错了粘贴和粘贴)。

在随后的代码中应该是:

activities.forEach(function(d) {
  rateById[d.key] = +d.values;
});

nest()rollup将数据放入keyvalues属性中,如您在控制台输出的嵌套数据中所见:

[{"key":"IQ-G02-D009","values":1},{"key":"IQ-G05-D030","values":2},{"key":"IQ-G05-D047","values":1},{"key":"IQ-G07-D047","values":1}]

更改这些字段,就可以了。