Использование d3.nest для суммирования значений в соответствии с определенным ключом и фильтрации другим ключом

#javascript #d3.js

#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. Пожалуйста, поместите некоторый образец css в качестве кода. Ваше текущее форматирование css неверно.

Ответ №1:

d3.nest не подходит для вашего случая. Проблема в том, что d3.nest будет генерироваться массив с этой конкретной структурой:

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

Фиксирована не только структура, но даже имена свойств ( key и values не могут быть изменены.

Итак, в вашем случае я бы предложил настраиваемую функцию. Например:

 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>