Используя API визуализации Google, я использую google.visualization.data.group для создания подтаблиц на основе моих необработанных данных. Мои необработанные данные используют прием {v:"US", f:"United States"} для отображения чего-то другого, кроме значения, но когда я использую функцию агрегирования, форматирование устраняется, оставляя только часть "США".
Есть ли способ сохранить исходное форматирование или простой способ добавить его обратно в таблицы данных, созданные с помощью группового агрегирования?
Образец данных:
[2010, {v:"MA", f:"Morocco"}, {v:"002", f:"Africa"}, {v:"002", f:"Northern Africa"}, 21.12724],
[2010, {v:"AW", f:"Aruba"}, {v:"019", f:"Americas "}, {v:"019", f:"Caribbean"}, 0.98],
[2010, {v:"AF", f:"Afghanistan"}, {v:"142", f:"Asia"}, {v:"142", f:"Southern Asia"}, 0.9861],
[2010, {v:"AO", f:"Angola"}, {v:"002", f:"Africa"}, {v:"002", f:"Middle Africa"}, 5.11774],
Агрегатная функция:
var countryData = google.visualization.data.group(
rawData,
[0, 1],
[{'column': 4, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
);
Редактировать:
При дальнейшем размышлении, вероятно, невозможно сгруппировать по формату, поскольку нет гарантии, что формат для каждого значения будет согласованным. Имея это в виду, вероятно, лучше (или только возможно) написать функцию, которая добавит форматы в каждый столбец моих данных. Таким образом, возникает вопрос: «Как, черт возьми, мне это сделать?»
Я действительно предпочел бы не создавать необработанные данные только как неформатированные значения, а затем дополнительные таблицы для поиска форматов для каждого значения. Для этого потребуются дополнительные 2 таблицы (одна для регионов с 28 строками, одна для стран с более чем 240 строками), а затем создание двух функций для просмотра каждого значения в сгруппированной таблице (в которой будут данные за 30+ лет, что означает тысячи строк) добавление значений.
Это кажется действительно сложным решением.
Есть ли способ сделать это с помощью функций-модификаторов? Могу ли я написать функцию для возврата каждого значения в таблице в виде форматированного объекта {v: "US", f: "United States"}? Или есть простой способ написать средство форматирования столбцов, которое будет искать соответствующее значение в моей исходной таблице и принимать этот формат? Что вызвало бы наименьшую головную боль как у меня (кто должен это написать), так и у пользователей (кто должен это загрузить)?
РЕДАКТИРОВАТЬ 2:
Похоже, я должен создать средство форматирования для новой таблицы, используя что-то вроде этого:
function (dt, row) {
return {
v: (dt.getValue(row, 1) / 1000000),
f: (dt.getValue(row, 1) / 1000000) + 'M'
}
}
Но проблема заключается в том, что, поскольку я не имею дело с числовыми форматами, мне пришлось бы создать какую-то таблицу поиска, которая будет принимать значение, искать его в таблице поиска, а затем возвращать соответствующий формат. Также похоже, что мне, возможно, придется перебирать всю таблицу, строка за строкой, что составляет тысячи строк.
Я не могу себе представить, что нет простого способа сделать это без грубого перебора циклов и присвоения значений.
РЕДАКТИРОВАТЬ 3:
Поэтому я попробовал кое-что хитрое. Вместо того, чтобы устанавливать каждую строку как значение/формат, я создал часть значения/формата в виде строки, а затем после группировки использовал eval() для оценки объектов. Это сработало отлично. Вот данные:
[2010, "{v: 'MA', f: 'Morocco'}", 21.13],
[2010, "{v: 'AW', f: 'Aruba'}", 0.98],
[2010, "{v: 'AF', f: 'Afghanistan'}", 0.99],
[2010, "{v: 'AO', f: 'Angola'}", 5.12],
Вот новый код:
var countryCount = countryData.getColumnRange(0).count;
for (var i = 0; i <= countryCount; i++) {
countryData.setValue(i, 1, eval('(' + countryData.getValue(i,1) + ')'));
};
Проблема в том, что когда я вывожу это в Google DataTable, он показывает {v: 'AE', f: 'Объединенные Арабские Эмираты'}, несмотря на то, что проверка результата с помощью eval правильно дает мне:
>>> eval('(' + countryData.getValue(i,1) + ')')
Object v="AE" f="United Arab Emirates"
Так что я делаю неправильно здесь?