• Javascript中的sort()语法浅谈


    MDN中sort定义

    MDN中是这样介绍sort()函数的:sort() 方法对数组的元素做原地的排序,并返回这个数组。 sort 可能不是稳定的。默认按照字符串的Unicode码位点(code point)排序。

    arr.sort([compareFunction])

    语法说明

    compareFunction
    可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序。
    简单示例:

    var tt = [23,12,34,1,560];
    console.log(tt.sort()); //此时sort()内没有参数
    //输出为 [1, 12, 23, 34, 560]

    简单的说,sort() 在没有参数时,返回的结果是按升序来排列的。即字符串的Unicode码位点(code point)排序。
    如果指明了 compareFunction(a,b) ,那么数组会按照调用该函数的返回值排序。记 ab 是两个将要被比较的元素:

    • 如果 compareFunction(a, b) (返回的值)小于 0 ,那么 a 会被排列到 b 之前,即参数a,b的顺序保存原样

    • 如果 compareFunction(a, b) (返回的值) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);

    • 如果 compareFunction(a, b) (返回的值)大于 0 , b 会被排列到 a 之前。即交换参数a,b的顺序

    • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

    一个栗子

    Codewars上有这样一道kata,是这样的:给定一个包含对象的数组list和一个比较关键字sortBy(数组中对象的值总为数值,比较关键字总是存在,且是对象的某一个键),返回一个降序排序后的数组。
    解决方案是这样的:

    function sortList (sortBy, list) {
      return list.sort(function(a,b){
        return b[sortBy]-a[sortBy]
      });
    }

    Note

    写给与我一样的初学者:
    问题是上面的函数为什么不这样写:return b.a-a.b 我们这样尝试一下:

    function sortList (sortBy, list) {
      return list.sort(function(a,b){
          console.log(sortBy);//输出为b
          console.log(a.sortBy);//输出为undefined
          console.log(a[sortBy]);//输出为3,2,40
        return b[sortBy]-a[sortBy]
      });
    }
    sortList('b',[
      {a: 1, b: 3},
      {a: 3, b: 2},
      {a: 2, b: 40},
      {a: 4, b: 12}
    ]);

    实际上,变量sortBy 的值为b,但在代码a.sortBy 中,sortBy的值并没有引用,sortBy被认为是a对象的一个属性,但a对象实际并没有sortBy这个属性,所以该代码会输出为undefined,因此我们要访问这类属性,应该写成a[sortBy]的代码。
    在这里,sortBy是一个变量名,如果变量名为某对象的属性,则只能通过[]运算符进行对象属性的访问。


    (待续)

  • 相关阅读:
    C#泛型集合之——链表
    C#泛型集合之——列表
    C#泛型集合之——哈希集合
    gRPC asp.net core自定义策略认证
    asp.net core mvc中自定义ActionResult
    当职责链遇到DI
    开发一个带UI的库(asp.net core 3.0)
    两个集合对比
    对日编程的一些小知识点
    基于aws api gateway的asp.net core验证
  • 原文地址:https://www.cnblogs.com/xihe/p/6138612.html
Copyright © 2020-2023  润新知