如何使用 jQuery "sortElements"插件对数字列进行排序?



我在表上使用jQuery脚本"sortElements"对它们的列进行排序,但我注意到在数字列中排序不起作用。对它们进行排序的结果类似于"100 20 250 30"。我不明白如何解决这个问题。你能帮我吗?

这是"sortElements"脚本:https://j11y.io/javascript/sorting-elements-with-jquery/

这是我在页面中使用的脚本:

var table = $('table');
$('table th')
.wrapInner('')
.each(function(){
var th = $(this),
thIndex = th.index(),
inverse = false;
th.click(function(){
table.find('td').filter(function(){
return $(this).index() === thIndex;
}).sortElements(function(a, b){
if( $.text([a]) == $.text([b]) )
return 0;
return $.text([a]) > $.text([b]) ?
inverse ? -1 : 1
: inverse ? 1 : -1;
}, function(){
// parentNode is the element we want to move
return this.parentNode; 
});
inverse = !inverse;
});
});

我找到了这个问题的解决方案:jquery sortElement:按表数据的数值排序

我在以前的研究中没有发现。

您当前正在比较字符串,并且字符串是按字典进行比较的,这意味着,当您将数字作为字符串时,它们是按数字的较大值而不是实际值的顺序排列的。从本质上讲,对包含数字的字符串进行排序会首先得到所有的1,然后如果有多个以1开头的数字,它们会查看下一个数字,依此类推


演示1:

var numbers = ["2", "4", "3", "1"];
numbers.sort((a, b) => a > b);
console.log(numbers);

这里的数字都是个位数,这意味着它们将以正确的方式排列。


演示2:

var numbers = ["1", "4", "7", "12"];
numbers.sort((a, b) => a > b);
console.log(numbers);

这里,我们有个位数147,它们按正确的顺序排序,但我们也有12,它位于1之后。这是因为它的第一个数字是1,与1的值相同,所以会比较两个数字的第二个数字。由于2大于1的第二位,即零,因此它被排序在1之后。


演示3:

var numbers = ["10", "1", "1.3", "5", "76", "6001"];
numbers.sort((a, b) => a > b);
console.log(numbers);

在本例中,您可以看到1是先排序的,因为没有第二个数字。1之后的下一项是1.3,之后是10,这意味着在词典学术语中,小数点比0s"小"。


您应该做的是将您比较的内容转换为数字,而不是像这样:

sortElements(function(a, b){
a = parseInt(a);
b = parseInt(b);
if( $.text([a]) == $.text([b]) )
return 0;
return $.text([a]) > $.text([b]) ? inverse ? -1 : 1 : inverse ? 1 : -1;
}

希望这能有所帮助!

我找到了这个问题的解决方案:jquery sortElement:按表数据的数值排序

我在以前的研究中没有发现。

最新更新