我使用下面的代码对表中的列进行排序,将标题行用作触发器。
var tr = d3.selectAll("tbody tr");
d3.selectAll("thead th").data(forsort).on("click", function(k) {
tr.sort(function(a,b){
return a[k] - b[k]; });
});
问题是,有相当多的单元格具有相同的值。当我第一次单击对表进行排序时,它会按照预期进行排序。但是,如果我再次单击它,它会重新排列那些具有相同值单元格的行(来自用于排序的列)。
我想知道是否有任何方法来检查列是否已经排序,如果为真,则不允许重复排序。任何替代解决方案也是受欢迎的。
谢谢!
3条答案
按热度按时间qqrboqgw1#
我有个想法:
owfi6suc2#
只需记录你最后是如何对表进行排序的,并忽略对同一标题的重复点击。
或者,如果用户再次单击标题,您可能希望反向排序,这是可排序列表的常见行为。然后您将跟踪最后一个排序列和方向。
rkue9o1l3#
问题可能是你的比较器没有建立一个严格的总顺序。假设你按姓氏排序,两行有相同的姓氏但不同的名字,排序算法可以将这两行以任何顺序放置,因为从比较器的Angular 来看它们是等价的。因此排序结果是不唯一的,在多次执行中可能会不同,并且不可预测。
如果这是问题所在,你应该注意建立一个总顺序,例如有一个回退的最后比较,可能是aebitrary(name,id,timestamp)。如果真的需要,根据所有列进行排序,如果两行的所有列都相等,那么它们的顺序并不重要。