Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript d3数据解析/转换(从长到宽)_Javascript_D3.js_Dataformat - Fatal编程技术网

Javascript d3数据解析/转换(从长到宽)

Javascript d3数据解析/转换(从长到宽),javascript,d3.js,dataformat,Javascript,D3.js,Dataformat,我有一个类似csv格式的数据集: continents countries values Europe Germany 20 Europe France 30 Europe Spain 40 Asia Singapore 100 Asia Japan 300 Asia China 30 Asia Tiwan 500 America USA 50 America Canada 35 America Brazil 30 America E

我有一个类似csv格式的数据集:

continents  countries   values
Europe  Germany 20
Europe  France  30
Europe  Spain   40
Asia    Singapore   100
Asia    Japan   300
Asia    China   30
Asia    Tiwan   500
America USA 50
America Canada  35
America Brazil  30
America Equador 14
当我使用
d3.csv
map
解析它时,数据如下所示:

[
{continents: "Europe", countries: "Germany", values: 20}
{continents: "Europe", countries: "France", values: 30} 
{continents: "Europe", countries: "Spain", values: 40} and so forth. ]
我想做的是由大陆集团将格式转换成宽格式,这样数据看起来像这样

[
{continents: "Europe", 
    values: {"Germany" : 20},
            {"France" : 30},
            {"Spain" : 40}},
{continents: "Asia",
    values: {"Singapore" : 100},
            {"Japan" : 300},
            {"China" : 30}}
]    
我现在就是这样做的

d3.csv("/data/data.csv").then(function(csv) { 
    data = csv.map(function(d) {
        return {
            continents: d.continents,
            countries: d.countries,
            values: +d.values}
    }); 
格式不需要与上面的示例完全相同,但要点是将键:值与属于各自大陆组的国家和值配对


有人能告诉我如何制作吗?

更新为使用
d3.nest

是d3用于分组数据的对象。您可以使用它获取大部分信息,然后在之后执行快速转换:

var groups = d3.nest().key(d => d.continents).entries(rows),
    result = groups.map(function(d){
    return {
        continents: d.key,
        values: d.values
  };
这将产生如下结果:

[{"continents":"Europe",
  "values":[
    {"continents":"Europe","countries":"Germany","values":"20"}, ...
  ],
 },
 {"continents":"Asia",
  "values": [...]
 }, ... ]
备选方案:使用
d3.分组

另一种方法是利用现有的大部分方法,这是以下方法的一部分:

然后,您可以使用这些
来获取所需的对象:

groups.map(function(d){
    return {
    continents: d[0],
      values: d[1]
    };
});

您好@mdml,谢谢您的回答。这似乎是有道理的,我试过了,但我不断地得到一个错误,“TypeError:d3.group不是一个函数”。你对这个错误有什么想法吗?除了上面的问题,你能建议一些解决方法以防d3.group不适合我吗?一些纯JS也可以。@Jamie:我已经更新为使用
d3.nest
,因为
d3.group
只是
d3数组的一部分。非常感谢您的回复。这真的帮助我理解了它。这就是我要找的。我还有一个问题,如果数据由两组嵌套在两个级别上会怎么样?例如,还有一个col,gender,数据按大陆和国家嵌套。那么,地图将如何工作以具有相同的格式,{大陆:{国家:{男性:值,女性:值}}}我建议您作为另一个问题提问,尽管如果我理解正确,您似乎可以使用两个键。
groups.map(function(d){
    return {
    continents: d[0],
      values: d[1]
    };
});