使用d3.nest根据特定键对值求和并由另一个键过滤

时间:2019-04-15 18:53:52

标签: javascript d3.js

我有一个csv文件,其中包含三列:

College,Undergraduate,IOP
Science,1,Yes
Science,3,No
Arts,2,Yes
Arts,1,No
Science,2,Yes

我想创建一个变量:[{type: "Arts", Applied: 2},{type:"Science",Applied:3}]。我只想将IOP的希望值加起来是

我的代码:

         function csvToJSONUSPstudents(csv){

                d3.csv(csv, function(error, csv_data) {
                if (error) throw error;


                var datas = d3.nest()
                  .key(function(d) { return d.College;})
                  .rollup(function(d) {


                  return {

                     Applied: d3.sum(d, function (g) {
                       return g.Applied;
                     }),

                   };

                     }).entries(csv_data);


                  var data = [];
                  var x = {};

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

                      x =  {type:datas[i].key , 
                      Applied:datas[i].values.Applied}
                      data.push(x)
                       }

                      console.log(data);


                  });







                  }

1 个答案:

答案 0 :(得分:0)

d3.nest不太适合您的情况。问题在于d3.nest将生成具有以下特定结构的数组:

[{key: foo, values: [],
{key: baz, values: [],
{key: baz, values: []];

不仅结构是固定的,甚至属性名称(keyvalues也无法更改。

因此,根据您的情况,建议使用自定义功能。例如:

const csv = `College,Undergraduate,IOP
Science,1,Yes
Science,3,No
Arts,2,Yes
Arts,1,No
Science,2,Yes`;

let data = d3.csvParse(csv);

data = data.filter(function(d) {
  return d.IOP === "Yes"
}).reduce(function(a, c) {
  const found = a.find(function(e) {
    return c.College === e.type;
  });
  if (found) {
    found.Applied += c.Undergraduate;
  } else {
    a.push({
      type: c.College,
      Applied: c.Undergraduate
    })
  };
  return a;
}, []);

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