使用地图时,汇总返回未定义或具有值的数组

时间:2019-04-17 12:24:01

标签: javascript d3.js rollup

我目前正在使用相当大的数据集,因此我希望通过将数据嵌套在新变量“ nested_data”中来减小数据变量。

这是我正在使用的数据:

Landen,"Perioden","SITC","Onderwerpen_1","Waarde eenheid","Waarde"
Afghanistan,"2012","0 Voeding en levende dieren","Invoerwaarde","mln euro","1"
Afghanistan,"2012","1 Dranken en tabak","Invoerwaarde","mln euro","0"
Afghanistan,"2012","2 Grondstoffen niet eetbaar behalve...","Invoerwaarde","mln euro","."
Afghanistan,"2012","3 Minerale brandstoffen smeermiddele...","Invoerwaarde","mln euro","."
Afghanistan,"2012","4 Dierlijke en plantaardige oliën en ...","Invoerwaarde","mln euro","."
Afghanistan,"2012","5 Chemische producten","Invoerwaarde","mln euro","0"
Afghanistan,"2012","6 Fabricaten hoofdzakelijk gerangschi...","Invoerwaarde","mln euro","0"
Afghanistan,"2012","7 Machines en vervoermaterieel","Invoerwaarde","mln euro","1"
Afghanistan,"2012","8 Diverse gefabriceerde goederen","Invoerwaarde","mln euro","1"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","0"

我希望这是汇总的结果:

[
{
  "key": "0 Voeding en levende dieren",
  "value": 1
},
{
  "key": "1 Dranken en tabak",
  "value": 0
},
{
  "key": "2 Grondstoffen niet eetbaar behalve...",
  "value": 7
},
{
  "key": "3 Minerale brandstoffen smeermiddele...",
  "value": 1
},
{
  "key": "4 Dierlijke en plantaardige oliën en ...",
  "value": 9
},
{
  "key": "5 Chemische producten",
  "value": 4
},
{
  "key": "6 Fabricaten hoofdzakelijk gerangschi...",
  "value": 12
},
{
  "key": "7 Machines en vervoermaterieel",
  "value": 3
},
{
  "key": "8 Diverse gefabriceerde goederen",
  "value": 0
},
{
  "key": "9 Niet afzonderlijk genoemde goederen",
  "value": 13
}
]

我已经尝试过使用d3汇总:

.rollup(function(d){
    return d.Waarde;
})

结果如下:

result1

我的第二次尝试是使用“地图”,如下所示:

.rollup(function(value){
        return value.map(function(d){
            return d.Waarde;
        })
   })

我更喜欢该结果,但是仍然不是我想要的:

result2

尽管此方法确实向对象添加了正确的值,但它会将其放入数组中(“ map”显然可以这样做)。但是,我希望它不要将值放入数组中,而只是将其作为键的值。

1 个答案:

答案 0 :(得分:2)

在您的rollup方法中,第一个参数...

.rollup(function(d){
    return d.Waarde;
})

...不是对象:而是数组。因此,当您使用map ...

时,您几乎可以理解。
.rollup(function(value){
    return value.map(function(d){
        return d.Waarde;
    })
})

...但是问题在于map将返回一个数组,而这不是您想要的。您想要一笔款项:

.rollup(function(d) {
    return d3.sum(d, function(e) {
        return e.Waarde
    });
})

这是一个演示,其中数据有一些更改(在某些行中,您将"."作为值,这在这里没有什么意义):

const csv = `Landen,"Perioden","SITC","Onderwerpen_1","Waarde eenheid","Waarde"
Afghanistan,"2012","0 Voeding en levende dieren","Invoerwaarde","mln euro","1"
Afghanistan,"2012","1 Dranken en tabak","Invoerwaarde","mln euro","0"
Afghanistan,"2012","2 Grondstoffen niet eetbaar behalve...","Invoerwaarde","mln euro","4"
Afghanistan,"2012","3 Minerale brandstoffen smeermiddele...","Invoerwaarde","mln euro","2"
Afghanistan,"2012","4 Dierlijke en plantaardige oliën en ...","Invoerwaarde","mln euro","7"
Afghanistan,"2012","5 Chemische producten","Invoerwaarde","mln euro","0"
Afghanistan,"2012","6 Fabricaten hoofdzakelijk gerangschi...","Invoerwaarde","mln euro","0"
Afghanistan,"2012","7 Machines en vervoermaterieel","Invoerwaarde","mln euro","1"
Afghanistan,"2012","8 Diverse gefabriceerde goederen","Invoerwaarde","mln euro","1"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","0"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","5"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","2"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","9"`;

const data = d3.csvParse(csv, d3.autoType);

const nest = d3.nest()
  .key(function(d) {
    return d.SITC
  })
  .rollup(function(d) {
    return d3.sum(d, function(e) {
      return e.Waarde
    });
  })
  .entries(data)

console.log(nest)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>