Кажется, проблема возникает из этой строки:
var dataArr = array.data;
Вы пытаетесь получить доступ к свойству data
, которое не найдено в строке JSON, следовательно, dataArr
возвращает undefined
и вызывает dataArray.length
возвращает 1, что вызывает исключение, как упоминалось в вопросе, поскольку в массиве, переданном в функцию arrayToDataTable()
, существуют только заголовки столбцов.
Для правильной передачи данных необходимо использовать JSON.parse()
, чтобы JSONстрока, возвращаемая в виде массива:
var dataArr = JSON.parse(array);
Это создаст массив, в котором будут содержаться заголовки столбцов и значения, подобные этому примеру:
[["Year", "Ov", "PD", "OL"],
[2018, 1000, 2000, 3000],
[2017, 4000, 5000, 6000],
[2012, 600, 400, 200],
[2013, 700, 500, 200],
[2014, 700, 400, 300],
[2015, 700, 300, 400],
[2016, 500, 300, 200],
[2017, 4000, 5000, 6000],
[2018, 1000, 2000, 3000]]
Обновление:
Вторая проблема заключается в том, что вы определяете [dataArray]
, который фактически создает вложенный массив, это свойство, вызывающее wg
в data
, имеет массив нулевой длины и диаграмма не отображается должным образом, поэтому вы должны удалить квадратные скобки внешнего массива:
var data = google.visualization.arrayToDataTable(dataArray);
И третья проблема заключается в том, что вы дублируете группы данных (т. Е. [2017, 4000, 5000, 6000]
в 2 разных сериях).Вы должны удалить дублированную деталь, используя пользовательскую функцию.
Следовательно, ваш код должен выглядеть следующим образом:
var array = @Html.Raw(Json.Encode(Proj.Dash.JsonString));
alert("JSON.stringify " + array);
var dataArr = JSON.parse(array);
function drawChart() {
var dataArray = [['Year', 'Ov', 'PD', 'OL']];
for (var i in dataArr) {
dataArray.push([dataArr[i].Year, dataArr[i].Ov, dataArr[i].PD, dataArr[i].OL]);
}
alert(dataArray.length);
var data = google.visualization.arrayToDataTable(dataArray);
var options = {
chart: {
title: '',
subtitle: '',
},
bars: 'vertical',
hAxis: { format: '#' }, // optional
vAxis: { format: 'decimal' },
height: 500,
colors: ['#333333', '#3490e9', '#ff5a00'],
legend: {
position: 'none'
}
};
var chart = new google.charts.Bar(document.getElementById('columnchart_material'));
chart.draw(data, google.charts.Bar.convertOptions(options));
}
Дополнительная ссылка: arrayToDataTable () function
Рабочий пример: .NET Fiddle