有没有什么方法可以保留原始格式,或者在使用分组聚合创建的DataTable上轻松添加它?
示例数据:
[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'}]
);
编辑:
经过进一步思考,由于无法保证每个值的格式都是一致的,所以很可能不可能通过格式进行分组。因此,最好(或者唯一可行的方法)是编写一个函数为数据的每一列添加格式。那么问题就变成了:“我该如何做到这一点?"
我真的不想仅将我的原始数据创建为未经格式化的值,然后再创建其他表格来查找每个值的格式。这需要额外的两个表格(一个是28行的地区表,一个是超过240行的国家表),然后创建两个函数来查找分组表中的每个值(该表将拥有30多年的数据,意味着数千行),以添加这些值。
这似乎是一个非常复杂的解决方案。
是否有一种使用修饰器函数来完成这项工作的方法?我能否编写一个函数来将表格中的每个值返回为{v:“US”,f:“美国”}格式的对象?或者是否有一种简单的方法来编写列格式化程序,以在原始表格中查找适当的值并采用该格式?哪种方法对我(必须编写它的人)和用户(必须加载它的人)造成的困扰最小?
编辑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 时,尽管使用 eval 正确地给出了以下结果,{v: 'AE',f:'United Arab Emirates'}。>>> eval('(' + countryData.getValue(i,1) + ')')
Object v="AE" f="United Arab Emirates"
那么我在这里做错了什么呢?