JS中数组的sort()排序

https://blog.csdn.net/NinthSea/article/details/72879364

1.sort() 方法的带参和无参调用:
sort()方法对数组元素进行排序,参数可选。返回一个数组的引用,不会创建新的数组对象而是将原数组改变成排序后的数组。

  • 无参调用:
    如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串以便进行比较。如果数组元素是数字的话会得到错的结果,这时需要使用有参的方法。
  • 带参调用:
    如果想要自己规定排序方式,就需要在sort()方法中提供一个比较函数,该函数要比较两个值即有两个形参a 和 b,函数执行时浏览器会将数组中的元素依次作为实参传入,返回一个用于说明这两个值的相对顺序的数字。sort()方法会根据函数返回值来进行数组元素的交换。返回值如下:

     若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
     若 a 等于 b,则返回 0。
     若a 大于 b,则返回一个大于 0 的值。 
    
     换句话说,当函数返回值小于0时,a与b的顺序不变;返回值为0时,则表示两数相等,顺序也不变;返回值大于0时,a与b交换位置。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.sort(sortby)方法的排序函数sortby();

  • 常用的一些排序函数:

<script type="text/javascript">

        //排序函数
            function compare(a,b){
                if(a>b){
                    return 1; //sort()中参数大于0,交换a b顺序,升序排列
                }else if(a<b){
                    return -1;  //sort()中参数小于0,a b顺序不变,升序排列
                }
            }

            var arr = [2,0,6,3,8];
            var newArr = arr.sort(compare);  //此处调用比较函数,并将其返回值作为sort方法参数
            document.write("升序排列后的数组为:"+newArr);
        </script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上边是很简单的一个比较函数,是按升序排列的,如果要按降序排列,只要将返回值进行交换即可。

下边这个和上边函数实现的功能一样,只是写法不一样:

<script type="text/javascript">

            function compare(a,b){
                return a-b;  //如果a>b,返回值大于0,交换a b,升序排列
                //return b-a; 如果b-a大于0,即b大于a则交换,较大的b 在前,降序排列 
            }

            var arr = [2,1,3,4,0];
            var newArr = arr.sort(compare);

            document.write("升序排列后的数组:"+newArr);
        </script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

以上两种只是排序函数中最简单常用的,都可以将数组中的元素排序。
下面的函数可以将元素按先奇后偶排序:
要将元素按照先奇后偶的顺序排列,则a b交换的条件为a是偶数b是奇数且a>b。有了排序的条件,就可以很容易写出比较函数。

<script type="text/javascript">

            function compare(a,b){
                if(a%2==0 && b%2==1){
                    return 1;  //1.对偶数和奇数排序,先将全部奇数放在前边,偶数放在后边
                }
                if((a%2==1 && b%2==1 || a%2==0 && b%2==0 )&& a>b){
                    return 1; //2.分别对奇数和偶数进行从小到大的顺序排序
                }


            }

            var arr = [2,1,3,4,0];
            var newArr = arr.sort(compare);

            document.write("升序排列后的数组:"+newArr);
        </script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
排序结果为 1,3,0,2,4 
  • 1
  • 2

最后一种是对字符数组进行不区分大小写将其按照Unicode 编码从大到小排列:
var arr = [A,b,a,B];
要实现这种排序的比较函数的条件为:当a.toString().toLowerCase()

<script type="text/javascript">
            var arr = ["a","A","B","C","b"];
            function compare(a,b){
                if(a.toString().toLowerCase() < b.toString().toLowerCase()){
                    return -1;
                }else{
                    return 1; //按编码从小到大排列
                }
            }
            var newArr = arr.sort(compare);
            document.write(newArr);
        </script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

a.toString()方法会返回 a的字符串表达形式 “a”.
如果 a 是一个变量存储的为一个Number型数值 2,则 a.toString()方法会返回 该数值的字符串表达形式 “2”;
此处Array的toString()方法和类的toString()方法不同,Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。Arrays的toString方法是返回指定数组内容的字符串表示形式。

3.对sort(sortby)方法的理解:
sort()方法主要依靠其回调函数来进行排序,回调函数中需要两个参数,在执行sort()方法时会调用回调函数,这时会将调用sort()方法的数组中的元素作为实参两两依次作为回调函数实参传入,通过回调函数的条件进行比较得出一个返回值,将返回值作为sort()函数的参数来判断是否交换。
所以回调函数规定了排序的条件以及进行排序,而sort()方法是根据这个条件进行交换。所以sort()函数只执行一次,回调函数会依次两两传入实参。

原文地址:https://www.cnblogs.com/kevoin/p/9483135.html