jquery 检查列是否已排序

lymnna71  于 2023-03-22  发布在  jQuery
关注(0)|答案(3)|浏览(101)

我使用下面的代码对表中的列进行排序,将标题行用作触发器。

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]; });  
});

问题是,有相当多的单元格具有相同的值。当我第一次单击对表进行排序时,它会按照预期进行排序。但是,如果我再次单击它,它会重新排列那些具有相同值单元格的行(来自用于排序的列)。
我想知道是否有任何方法来检查列是否已经排序,如果为真,则不允许重复排序。任何替代解决方案也是受欢迎的。
谢谢!

qqrboqgw

qqrboqgw1#

我有个想法:

var tr = d3.selectAll("tbody tr");  
lastSort = null;
d3.selectAll("thead th").data(forsort).on("click", function(k) { 
    if(lastSort != k){
        tr.sort(function(a,b){  
            return a[k] - b[k]; 
        });
        lastSort = k;
    }
});
owfi6suc

owfi6suc2#

只需记录你最后是如何对表进行排序的,并忽略对同一标题的重复点击。
或者,如果用户再次单击标题,您可能希望反向排序,这是可排序列表的常见行为。然后您将跟踪最后一个排序列和方向。

rkue9o1l

rkue9o1l3#

问题可能是你的比较器没有建立一个严格的总顺序。假设你按姓氏排序,两行有相同的姓氏但不同的名字,排序算法可以将这两行以任何顺序放置,因为从比较器的Angular 来看它们是等价的。因此排序结果是不唯一的,在多次执行中可能会不同,并且不可预测。
如果这是问题所在,你应该注意建立一个总顺序,例如有一个回退的最后比较,可能是aebitrary(name,id,timestamp)。如果真的需要,根据所有列进行排序,如果两行的所有列都相等,那么它们的顺序并不重要。

相关问题