为什么数组排序函数在Javascript中返回更改的结果?
当我使用数组排序函数对为什么数组排序函数在Javascript中返回更改的结果?,javascript,sorting,Javascript,Sorting,当我使用数组排序函数对列表进行排序时,得到了一个奇怪的结果 代码如下: <style> ul, li{ display:block; font-size:10px!important; white-space:nowrap!important; } ul{ clear:both; overflow: hidden; } li{ float: left; widt
列表进行排序时,得到了一个奇怪的结果
代码如下:
<style>
ul, li{
display:block;
font-size:10px!important;
white-space:nowrap!important;
}
ul{
clear:both;
overflow: hidden;
}
li{
float: left;
width: 80px;
margin: 2px;
overflow: hidden;
}
.sourceList{
background: skyblue;
}
.changeList{
background: pink;
}
</style>
<ul class="sourceList">
<li><span>87761</span></li>
<li><span>87762</span></li>
<li><span>87763</span></li>
<li><span>87764</span></li>
<li><span>87765</span></li>
<li><span>87766</span></li>
<li><span>87767</span></li>
<li><span>87768</span></li>
<li><span>87769</span></li>
<li><span>877610</span></li>
<li><span>877611</span></li>
<li><span>877612</span></li>
<li><span>877613</span></li>
<li><span>877614</span></li>
</ul>
<ul class="changeList">
<li><span>87761</span></li>
<li><span>87762</span></li>
<li><span>87763</span></li>
<li><span>87764</span></li>
<li><span>87765</span></li>
<li><span>87766</span></li>
<li><span>87767</span></li>
<li><span>87768</span></li>
<li><span>87769</span></li>
<li><span>877610</span></li>
<li><span>877611</span></li>
<li><span>877612</span></li>
<li><span>877613</span></li>
<li><span>877614</span></li>
</ul>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
var t1 = $('.changeList li')
t1.sort(function(a,b){
return 0;
});
$('.changeList').html(t1);
</script>
李先生{
显示:块;
字体大小:10px!重要;
空白区:nowrap!重要;
}
保险商实验室{
明确:两者皆有;
溢出:隐藏;
}
李{
浮动:左;
宽度:80px;
保证金:2倍;
溢出:隐藏;
}
.sourceList{
背景:天蓝色;
}
.变更单{
背景:粉红色;
}
- 87761
- 87762
- 87763
- 87764
- 87765
- 87766
- 87767
- 87768
- 87769
- 877610
- 877611
- 877612
- 877613
- 877614
- 87761
- 87762
- 87763
- 87764
- 87765
- 87766
- 87767
- 87768
- 87769
- 877610
- 877611
- 877612
- 877613
- 877614
变量t1=$('.changeList li')
t1.排序(函数(a,b){
返回0;
});
$('.changeList').html(t1);
我创建了两个
,它们包含相同的内容。在第二个
的子函数中使用sort函数后,我发现即使输入了一个空函数参数,结果也发生了变化
为什么会这样?排序函数返回零意味着元素彼此相等。由于您不知道底层的排序算法,元素可以按任何顺序馈送到函数,只有结果才重要 因为你的函数说所有元素都是相等的,所以它们可以出现在任何结果中(事实上,按照最适合底层排序算法的顺序)
李先生{
显示:块;
字体大小:10px!重要;
空白区:nowrap!重要;
}
保险商实验室{
明确:两者皆有;
溢出:隐藏;
}
李{
浮动:左;
宽度:80px;
保证金:2倍;
溢出:隐藏;
}
.sourceList{
背景:天蓝色;
}
.变更单{
背景:粉红色;
}
- 87761
- 87762
- 87763
- 87764
- 87765
- 87766
- 87767
- 87768
- 87769
- 877610
- 877611
- 877612
- 877613
- 877614
- 87761
- 87762
- 87750
- 87764
- 87765
- 87707
- 87767
- 87768
- 87769
- 877610
- 877611
- 877612
- 877614
- 877613
$('.changeList').children().detach().sort(函数(a,b){
返回$(a.text()-($(b.text());
}).appendTo(“.changeList”);
如果可用(以获得稳定排序),则使用mergesort对非数字类型的连续数组进行字符串化和排序,如果没有可用的合并排序,则使用qsort
现在,当通过sort()在内部字符串化时,t1的所有元素都会给出“[object HTMLLIElement]”。这是因为jQuery选择器选择的是DOM,而不是它们的值
因此,出现了不希望出现的结果
试着运行这个,你会得到你的答案
var t1 = $('.changeList li');
var t2 = [];
for (i = 0; i < t1.length; i++) {
t2.push(t1[i].toString()); //this is what happens in sort() before initiating merger sort.
}
console.log(t2);
var t1=$('.changeList li');
var t2=[];
对于(i=0;i
排序函数有效地表示所有元素都是相等的,因此最终将以随机顺序结束