为什么数组排序函数在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
排序函数有效地表示所有元素都是相等的,因此最终将以随机顺序结束