一. JS 数组排序
在JS中,有一个排序方法, sort(), 可以直接 arr.sort(), 进行相应的排序。但这个排序,只是针对的单值,如字符串,数值类型的排序,无法针对JS对象数组进行排序。 需要在sort() 方法中添加相应的排序规则的方法。 接下来,讲解一下 Array 中的sort() 方法。
按照ASCII 的顺序进行排序。
ASCII 码图片:
图片来源于百度百科: https://baike.baidu.com/item/ASCII/309296
二. JS 针对字符串的排序。 (按照ASCII 进行排序)
数组中存放的是单值 字符串形式的。
function validateArrF1(){ //1.定义字符串的数组。 var arr=['A','B','a','b','ACD','ACE']; //2. 将数组进行排序。 单值的。 arr.sort(); //3.输出新的排序后的数组。 console.log(arr.toString()); }
运行这个方法,结果为:
A的值为65,小a 为97, 按照ASCII 进行排序。
三. JS针对数字的排序
三.一 默认toString() 转换成字符串再排序
数组中存放的是单值 数字形式。
function validateArrF2(){ //1.定义数字形式的数组。 var arr=[123,125001,234,234001,100,100001,101101]; //会先将其转换成字符串。 //2. 将数组进行排序。 单值的。 arr.sort(); //3.输出新的排序后的数组。 console.log(arr.toString()); }
运行,
发现,并没有按照 数字大小的顺序进行排序。 内部是先将数字转换成了字符串 toString(), 然后成为了数字型字符串,按照ASCII 码进行排序。
这样,很明显是不可以的。需要自定义比较器。 (但有时,也会按照这种形式排序,如: 科目的编号, 101为父,101101, 101102, 102,102101,102102 等, 这样排序可以看出父与子之间的关系。 但那时,科目编号本身类型就是字符串)
三.二 自定义比较器,令其按照数字大小进行排序
//定义数字比较的方法。 function compareNum(x,y){ if(x<y){ //是升序排序。 return -1; }else if(x>y){ return 1; }else{ return 0; } } function validateArrF4(){ //1.定义数字形式的数组。 var arr=[123,125001,234,234001,100,100001,101101]; //会先将其转换成字符串。 //2. 将数组进行排序。 sort() 方法里面传入比较的函数,内包。 arr.sort(compareNum); //3.输出新的排序后的数组。 console.log(arr.toString()); }
在sort() 方法里面放入比较的函数。
展示输出:
四。JS针对数字与字符串混合的排序。
JS数组中,可能既存在数字,也存在字符串,那么这个时候,如何进行排序呢?
function validateArrF3(){ //1.定义数字形式的数组。 var arr1=['A','B','a','b','ACD','ACE']; var arr2=[123,125001,234,234001,100,100001,101101]; //会按照ASCII 码进行相应的排序。 var arr=arr1.concat(arr2); //2. 将数组进行排序。 单值的。 arr.sort(); //3.输出新的排序后的数组。 console.log(arr.toString()); }
展示输出:
数字会先转换成字符串,然后按照字符串进行相应的排序。 其中,数字0~9 为 48~57, 是在A 65, a97 之前的,所以会先输出数字,再输出字符串。
如果这个时候,在arr.sort() 里面放入 数字排序的方法呢?
arr.sort(compareNum);
显示效果如下:
这个时候,很奇怪,为什么是这样的呢?
其实,A 字符是可以转换成 数字的, 是65, a是字符,也可以转换,转换成 97. 变成了数字。 字符串只取其中的第一个字符进行比较,如果相同,才比较第二个。