Прежде всего, вывод , описанный в вашем вопросе, - это не фактический вывод, который вы ищете, это просто структура, которую вы хотели бы иметь в CSV, чтобы вы могли получить желаемый результат:d3.csv
, как и d3.csvParse
(используется внутри), возвращает массив объектов .Это также относится к d3.tsv
(CSV в вашем вопросе выглядит как TSV ... к счастью, это действительно не имеет значения, решение такое же, будь то CSV или TSV).
При этом, не используйте d3.nest
, который в любом случае будет устаревшим.Вы также не можете использовать функцию строки, так как функции строки вызываются для каждой строки в CSV.Итак, простейшая альтернатива - использовать чистое решение JavaScript для создания новой структуры данных.
Например, использовать reduce
:
const csv = `name,year,count
Sam,2012,3
Mike,2012,4
Jeff,2013,5
Sam,2012,8
Sam,2013,8
Jeff,2013,9`;
const data = d3.csvParse(csv, d3.autoType);
const newData = data.reduce(function(acc, curr) {
const foundObject = acc.find(function(d) {
return d.name === curr.name && d.year === curr.year;
});
if (foundObject) {
foundObject.count += curr.count;
} else {
acc.push(curr)
};
return acc;
}, [])
console.log(newData);
<script src="https://d3js.org/d3.v5.min.js"></script>