如果我们需要对对象数组进行特定顺序的排序,我们很可能会直接找一个JS库来使用。其实大可不必,JS原生的Array.sort可以直接进行一些复杂而美观的排序。在本文中,将介绍Array.sort的一些通用排序和一些棘手的操作。基本数组排序默认情况下,Array.sort函数将数组中每个需要排序的元素转换为字符串,并按Unicode顺序进行比较。constfoo=[9,1,4,'zebroid','afterdeck'];foo.sort();//返回[1,4,9,'afterdeck','zebroid']constbar=[5,18,32,newSet,{user:'EleanorRoosevelt'}];bar.sort();//returns[18,32,5,{user:'EleanorRoosevelt'},Set{}]你可能会奇怪为什么32排在5之前。发生这种情况是因为数组中的每个元素首先被转换为字符串,并且在Unicode顺序中,“32”出现在“5”之前。需要注意的是Array.sort会改变原来的数组。constbaz=['Mycatatemyhomework',37,9,5,17];baz.sort();//修改baz数组console.log(baz);//显示[17,37,5,9,'Mycatatemyhomework']为了避免这种情况,我们可以创建一个新的待排序数组实例,然后在新数组上进行修改。在这里您可以使用Array.slice返回一个新的Array实例。//创建baz数组的新实例并对其进行排序constsortedBaz=baz.slice().sort();我们还可以使用ES6中的扩展运算符来实现:constsortedBaz=[...baz].sort();在这两种情况下,输出是相同的:console.log(baz);//['Mycatatemyhomework',37,9,5,17];console.log(sortedBaz);//[17,37,5,9,'Mycatatemyhomework']单独使用Array.sort无法对对象数组进行排序。不过不用担心,sort还提供了一个参数,可以根据比较函数的返回值对数组元素进行排序。使用比较函数排序假设foo和bar是compare函数要比较的两个元素,比较函数的返回值设置如下:小于0:foo大于0beforebar:bar之前等于0foo:foo和bar保持彼此不同的变化。让我们看一个简单的例子:constnums=[79,48,12,4];functioncompare(a,b){if(a>b)return1;if(b>a)return-1;return0;}nums.sort(compare);//=>4,12,48,79我们可以稍微重构一下:functioncompare(a,b){returna-b;}使用箭头函数重构:nums.sort((a,b)=>a-b);如何对对象数组进行排序现在,让我们对对象数组进行排序。假设有以下歌手数组:constsingers=[{name:'StevenTyler',band:'Aerosmith',born:1948},{name:'KarenCarpenter',band:'TheCarpenters',born:1950},{name:'KurtCobain',band:'Nirvana',born:1967},{name:'StevieNicks',band:'FleetwoodMac',born:1948},];我们可以使用compare函数,然后根据singers中的band字段进行排序。functioncompare(a,b){//使用toUpperCase()忽略字符大小写constbandA=a.band.toUpperCase();constbandB=b.band.toUpperCase();letcomparison=0;if(bandA>bandB){comparison=1;}elseif(bandA
