• javascript数组排序


        javascript原生排序算法sort(),如果不带排序函数,那么就是默认按照升序排列。如果是数字类型就按照从小到大的顺序排列,如果是字符串,就按照字母顺序排列。

    /**

    * Sorts an array in place.

    * This method mutates the array and returns a reference to the same array.

    * @param compareFn Function used to determine the order of the elements. It is expected to return

    * a negative value if the first argument is less than the second argument, zero if they're equal, and a positive

    * value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.

    * ```ts

    * [11,2,22,1].sort((a, b) => a - b)

    * ```

    */

    sort(compareFn?: (a: T, b: T) => number): this;

        排序方法定义规定,如果带排序函数(两个参数),并且函数返回负数,一般用-1表示,表示第一个参数小于第二个参数,如果返回0,表示两个参数相等,返回正数,一般用1表示,表示第一个参数大于第二个参数。

        从这段描述来看,我们似乎并不清楚,升序排列,降序排列有什么区别?

        先来看几个简单的例子:

    1. var arr = [1,3,4,2]
    2. console.log(arr)
    3. arr.sort()
    4. console.log(arr)
    5. //==============
    6. var fruits = ["banana","apple","watermelon","grape","kiwifruit"]
    7. console.log(fruits)
    8. fruits.sort()
    9. console.log(fruits)
    10. //==============
    11. var list = ["a_1","a_11","a_2","b_1","b_10","b_3"]
    12. console.log(list)
    13. list.sort()
    14. console.log(list)
    '
    运行

        运行结果:

     

        前面两个排序,纯数字和纯字母排序,默认排序是符合我们的期望的。第三个排序,它是一个字母数字的组合,默认只按照字母顺序排列,其实我们期望得到的结果是:

    a_1,a_2,a_11,b_1,b_3,b_10 

         需要这样的排序结果,我们就不能只用默认的排序,我们需要自定义排序规则,我们希望先按照字母排序,字母相同则按照数字排序。这就要求排序需要按照第二个属性来排序,这里虽然是一个字符串数组,完全可以看作一个对象数组,我们不仅需要按照姓名排序,还需要按照序号排序。

        我们修改第三个排序:

    1. var list = ["a_1","a_11","a_2","b_1","b_10","b_3"]
    2. console.log(list)
    3. list.sort((a,b)=>{
    4. var obja = a.split('_')
    5. var objb = b.split('_')
    6. var namea = obja[0]
    7. var nameb = objb[0]
    8. var ida = obja[1]
    9. var idb = objb[1]
    10. if(namea==nameb){
    11. return ida - idb
    12. }
    13. return namea - nameb
    14. })
    15. console.log(list)
    '
    运行

        运行结果:

       

        乍一看,没毛病,正是我们需要的排序。但是我们忽略了一个问题,字符串排序不能直接和数字类型一样做减法。我们在数组中间增加一个元素"c_2",看看结果:

     

        很意外,字母排序好像没有生效。这里namea-nameb其实会做一个隐式转换,直接做减法,而字符串是不能做减法的,所以结果是NaN。并不是前面说的-1,0,1。 

         他们虽然不能做减法操作,但是却可以比较大小,namea < nameb。但是这种结果返回的是布尔类型(true,false),所以我们还需要做个转换,namea < nameb? -1 :1

    还有一种判断方法,就是利用字符串函数localeCompare来比较。这个代码就不贴出来了,大家可以根据下面的截图来感受一下它的作用:

    它对字符串作比较,并且返回值正好是-1,0,1三者之一,可以看作是对字符串作比较的一个封装函数。 

  • 相关阅读:
    不太会讲爱,其实已经偷偷幸福很久啦----我们的故事
    ROS中的图像数据
    tomcat 的日志详解
    认识ProtoBuf
    JavaWeb实现登录注册功能[代码+详解]
    Hive数据定义语言-DDL-建表高阶语法(内外部、分区、分桶、事务、视图、物化视图)
    Spring Cloud 学习笔记(2 3)
    机器人制作开源方案 | 双轮提升搬运小车
    【【萌新的SOC学习之重新起航SOC】】
    洛谷 P4408 [NOI2003] 逃学的小孩(树的直径)
  • 原文地址:https://blog.csdn.net/feinifi/article/details/126962148