Формат рядов данных угловой диаграммы с накоплением nvD3

Я пытаюсь использовать свои собственные данные в диаграмме с накоплением nvD3. Пример формата данных с сайта Angular nvD3 имеет такой формат:

[{
     "key":"Series 1",
     "values":[[1025409600000,0],[1028088000000,-6.3382185140371]]
},
{
     "key":"Series 2",
     "values":[[1025409600000,0],[1028088000000,0]]
}]

У меня есть данные из моей базы данных в этом формате:

[{
     "Loc_Cnt":6,"Num_Cars":552,"Num_Employees":34,"active_month":"2017-10-01T00:00:00"
},
{
     "Loc_Cnt":4,"Num_Cars":252,"Num_Employees":14,"active_month":"2017-11-01T00:00:00"
}]

Я пытаюсь построить график из моих данных, три серии (Серия 1: Flt_Cnt, Серия 2: Num_Cars, Серия 3: Num_Employees). Для каждой серии значение оси X - это дата active_month, а значение оси Y - значение серии.

Как я могу либо A) преобразовать мои данные, чтобы они легко выглядели как данные примера, либо B) использовать мои данные, как на диаграмме AngularJs nvd3? Я чувствую, что.forEach для массива не будет эффективным для больших наборов данных и не так легко читается. Я пытался каким-то образом использовать d3.nest, но не смог получить правильный формат. Спасибо за вашу помощь!

1 ответ

Решение

Это не элегантно, но я грубо заставил свой путь найти решение. Если есть какие-то лучшие решения, пожалуйста, дайте мне знать.

var Loc_Cnt = [];
var Num_Cars = [];
var Num_Employees = [];
var obj = {};

//arr is the array of values in my format
arr.forEach(function (element) {
    //need the date in milisecond format
    var date = new Date(element.active_month);
    var time = date.getTime();
    
    //load corresponding arrays
    Loc_Cnt.push([time, element.Loc_Cnt]);
    Num_Cars.push([time, element.Num_Cars]);
    Num_Employees.push([time, element.Num_Employees]);
});

//load each key/values pair into new object
obj["Loc_Cnt"] = Loc_Cnt;
obj["Num_Cars"] = Num_Cars;
obj["Num_Employees"] = Num_Employees;

//d3.entries creates an object of key/VALUEs
arrRollup = d3.entries(obj);

//change the key word values to value
var i;
for (i = 0; i < arrRollup.length; i++) {
    arrRollup[i].values = arrRollup[i]['value'];
    delete arrRollup[i].value;
}

Другие вопросы по тегам