#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>