Возникли проблемы с обработкой некоторых объектов JavaScript...
Я создаю Google Chart на основе выбора пользователя - есть два списка с множественным выбором, которые создают такой объект:
$('option:selected', $('#slChartSettingsEntities')).each(function () {
var el1 = $(this);
$('option:selected', $('#slChartSettingsStats')).each(function () {
var el2 = $(this);
dashParms.items.push({
entityid: el1.val(),
statid: el2.val(),
entityname: el1.text(),
statname: el2.text()
});
});
});
Я использую dashParms
для создания столбцов на диаграмме следующим образом:
// preliminary stuff:
var seriesCount = 0; // this is what I'm trying to avoid
var data = new google.visualization.DataTable();
data.addColumn({ id: 'date', label: 'Date', type: 'date' });
data.addColumn({ id: result.companyName, label: result.companyName, type: 'number' });
if ($('#cbxEtc').is(':checked')) {
data.addColumn({ id: 'ave', label: 'Company Average', type: 'number' });
seriesCount++; // ...trying to avoid
}
// importantly:
for (var j = 0; j < dashParms.items.length; ++j) {
data.addColumn({
id: (dashParms.items[j].entityid + '#' + dashParms.items[j].statid),
label: (dashParms.items[j].entityname + ' (' + dashParms.items[j].statname + ')'),
type: 'number'
});
seriesCount++; // ...trying to avoid
}
Я передаю dashParms
на сервер и получаю обратно данные (C# List<List<object>>
; могу показать это подробно, но я думаю, что это не актуально), которые я использую для заполнения строк на диаграмме:
var jsonResult = $.parseJSON(result.chartData);
if (seriesCount == 0) {
$.each(jsonResult, function (k, v) {
data.addRow([
new Date(v[0], 0, 1),
v[1]
]);
});
}
else if (seriesCount == 1) {
$.each(jsonResult, function (k, v) {
data.addRow([
new Date(v[0], 0, 1),
v[1],
v[2]
]);
});
}
else if (seriesCount == 2) {
$.each(jsonResult, function (k, v) {
data.addRow([
new Date(v[0], 0, 1),
v[1],
v[2],
v[3]
]);
});
}
else if (seriesCount == 3) {
// etc etc etc
}
Я делаю то же самое с объектом конфигурации диаграммы:
if (seriesCount == 0) {
chartcfg = {
'chartType': 'ComboChart',
'options': {
'seriesType': 'bars'
}
};
}
else if (seriesCount == 1) {
chartcfg = {
'chartType': 'ComboChart',
'options': {
'seriesType': 'bars',
'series': {
1: { type: 'line', tooltip: true }
}
}
};
}
else if (seriesCount == 2) {
chartcfg = {
'chartType': 'ComboChart',
'options': {
'seriesType': 'bars',
'series': {
1: { type: 'line', tooltip: true },
2: { type: 'line', tooltip: true }
}
}
};
}
else if (seriesCount == 3) {
// etc etc etc
}
Как я могу реорганизовать и динамически создавать эти объекты, чтобы избежать болезненных идентификаций вплоть до 30? Я понимаю, что здесь есть два вопроса: 1) как создать массив, используемый для data.addRow()
, 2) как создать объект chartcfg
JSON.
Нужен пример JSON, данные серии поступают из JSON или вам просто нужен цикл для генерации 'series': 1: {type: 'line', tooltip: true }, ...N: {type: 'line', tooltip: true }
? Было бы проще, если бы 'series'
был массивом: 'series':[{ type: 'line', tooltip: true }, { type: 'line', tooltip: true }]
Не уверен на 100$, хотя я некоторое время не делал GVis.
вы можете добавить строки и построить вариант серии в том же цикле,
используйте массив значений для цикла в серии.
сначала создайте объект конфигурации по умолчанию,
затем зациклите массив json и значений...
var chartcfg = {
chartType: 'ComboChart',
options: {
seriesType: 'bars',
series: {}
}
};
$.each(jsonResult, function (k, v) {
var row = [];
$.each(v, function (index, value) {
if (index === 0) {
row.push(new Date(value, 0, 1));
} else {
row.push(value);
chartcfg.options.series[index] = {
type: 'line',
tooltip: true
};
}
});
data.addRow(row);
});