Javascript 我如何获得一个谷歌可视化表格,以便在有格式单元格值时对其进行排序?

Javascript 我如何获得一个谷歌可视化表格,以便在有格式单元格值时对其进行排序?,javascript,sorting,events,google-visualization,Javascript,Sorting,Events,Google Visualization,我正在使用大量的Google可视化表格在一个单页、多选项卡的web应用程序中显示各种数据。其中一些表的列使用格式化值。当用户单击这些列的列标题时,数据将根据基础值的排序顺序而不是格式化值的排序顺序进行排序。在某些情况下,这会导致用户无法对数据进行排序 我正在寻找一种方法来解决这个问题,这种方法可以在我的所有表中重用,最好是编写一个事件侦听器,该侦听器可以附加到每个表中,并将处理所有细节,而不管各种关联数据表的各个列中使用的数据类型如何,并且不管任何给定列是否使用格式化值。我的条件是,如果列中的任

我正在使用大量的Google可视化表格在一个单页、多选项卡的web应用程序中显示各种数据。其中一些表的列使用格式化值。当用户单击这些列的列标题时,数据将根据基础值的排序顺序而不是格式化值的排序顺序进行排序。在某些情况下,这会导致用户无法对数据进行排序

我正在寻找一种方法来解决这个问题,这种方法可以在我的所有表中重用,最好是编写一个事件侦听器,该侦听器可以附加到每个表中,并将处理所有细节,而不管各种关联数据表的各个列中使用的数据类型如何,并且不管任何给定列是否使用格式化值。我的条件是,如果列中的任何单元格使用格式化值,那么该列中的所有单元格都使用格式化值,但我没有每个列都使用格式化值的条件。如果列不使用格式化值,那么我希望根据列中的数据类型(例如,数字、字符串、日期等)进行常规排序

例如,我可以有一个如下所示的数据表。(此数据不是实际数据,但反映了对我来说有问题的情况。)

在不进行任何特殊配置的情况下,如果在ID列上按升序排序,该表将如下所示,正如用户所期望的:

ID   Places          Things
----------------------------------
1    Harbor Place    Dalmation
2    Alphaville      Top Favorites
3    Beta City       Best Things
如果用户单击Places列的标题,则该表如下所示,因为对基础数值执行升序排序:

ID   Places          Things
----------------------------------
1    Harbor Place    Dalmation
3    Beta City       Best Things
2    Alphaville      Top Favorites
但是,用户希望该表如下所示:

ID   Places          Things
----------------------------------
2    Alphaville      Top Favorites
3    Beta City       Best Things
1    Harbor Place    Dalmation
如果用户单击Things列的标题,由于基础字符串值的排序顺序,表将按如下升序排序:

ID   Places          Things
----------------------------------
2    Alphaville      Top Favorites
1    Harbor Place    Dalmation
3    Beta City       Best Things
用户希望这样:

ID   Places          Things
----------------------------------
3    Beta City       Best Things
1    Harbor Place    Dalmation
2    Alphaville      Top Favorites
我在StackOverflow和Google上搜索过,没有找到任何关于这种特殊情况的讨论。所以我一直在写我自己的事件监听器,但是当我试图把它写成可以在我的任何表中重用的东西时,它很快就变得非常复杂了。那么我是不是错过了一些简单的东西?有没有其他人遇到过这样的情况并解决了它;如果是,您做了什么?

您可以使用设置行顺序

dataView.setRows([1,2,0])

然后用数据视图绘制图表

table.draw(数据视图,选项)

'sort'
事件期间获取行的顺序是一个棘手的部分,
因为对于格式化值没有任何方便的方法,例如
getDistinctValues

在下面的工作代码段中,格式化的值被提取到一个数组中,
排序,然后使用
getFilteredRows
获取格式化值的行索引

google.charts.load('current'{
回调:函数(){
var dataTable=新的google.visualization.dataTable({
科尔斯:[
{类型:'number',标签:'ID'},
{类型:'number',标签:'Places'},
{类型:'string',标签:'Things'}
],
行:[
{c:[{v:1},{v:102735,f:'Harbor Place'},{v:'pet',f:'Dalmation'}]},
{c:[{v:2},{v:163848,f:'Alphaville'},{v:'my',f:'Top Favorites'}]},
{c:[{v:3},{v:113787,f:'Beta City'},{v:'ten',f:'Best Things'}]
]
});
//使用DataView设置行的顺序
var dataView=newgoogle.visualization.dataView(dataTable);
setRows([1,2,0]);
var table=新的google.visualization.table(document.getElementById('chart_div');
变量选项={
//使用事件来设置顺序
排序:'事件',
//设置列箭头
sortColumn:1,
排序:对
};
google.visualization.events.addListener(表'sort',函数(道具){
var SortValue=[];
var-sortRows=[];
变量sortDirection=(道具升序)?1:-1;
//将值加载到可排序数组中
对于(var i=0;i


事实上,它确实有帮助。在查看了您的解决方案后,@WhiteHat,并根据我的研究,我认为没有比这更简单的解决方案了。我把你的答案投了更高的票,总有一天当我达到15个代表时会出现。谢谢!请注意:当您没有指定格式化值时,此解决方案不会按照列的自然排序顺序对列进行排序。对getFormattedValue的调用将原始值转换为字符串,然后代码继续执行基于字符串的排序,而不管数据的原始数据类型如何。我仍然需要找出这一部分,可能还需要问另一个问题。在创建
数据表之前,您可以保存对
行的引用,然后用它代替上面的
sortValues
——引用变得有点困难,但所有需要的信息都应该在那里……在事件侦听器中,我希望在确定要执行的排序类型时避免引用数据表外部的任何内容。我可以使用DataTable上的列属性
ID   Places          Things
----------------------------------
3    Beta City       Best Things
1    Harbor Place    Dalmation
2    Alphaville      Top Favorites