关于sort的用法总结

176 阅读2分钟
基础版(排序数字,从小到大)
let arr = [0, 3, 1, 2];
arr.sort((a, b) => a - b); //0,1,2,3

最简略版,直接比较数组中元素的值(必须是数值,因为sort方法根据传入函数返回的值与0值的比较做排序)

进阶版(根据百家姓排序,复姓暂不考虑)
//百家姓的储存数组
let nameArr = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王'];

let arr = ['王铁柱', '孙二两', '李贵', '吴安国', '钱旺财', '郑兴邦', '周满仓', '赵栓柱'];
arr.sort((a, b)=>{
  //将名字中的第一个字提取出来,第一个字就是姓(演示效果不考虑复姓),然后通过姓在nameArr的索引排序
  return nameArr.indexOf(a.split('')[0]) - nameArr.indexOf(b.split('')[0])
})//'赵栓柱', '钱旺财', '孙二两', '李贵', '周满仓', '吴安国', '郑兴邦', '王铁柱'

当前方法只要有一个可以用作数组作为表作为参考,就可以通过indexOf方法查询到的下标数字进行排序

进阶版(成绩排序,先排总分,总分相同再根据语文成绩排序)
let arr = [
      {
        name: '王铁柱',
        totalScore: 610,
        chinese: 120,
      },
      {
        name: '孙二两',
        totalScore: 600,
        chinese: 103,
      },
      {
        name: '李贵',
        totalScore: 513,
        chinese: 107,
      },
      {
        name: '吴安国',
        totalScore: 607,
        chinese: 115,
      },
      {
        name: '钱旺财',
        totalScore: 600,
        chinese: 107,
      },
      {
        name: '郑兴邦',
        totalScore: 513,
        chinese: 124,
      },
      {
        name: '周满仓',
        totalScore: 499,
        chinese: 144,
      },
      {
        name: '赵栓柱',
        totalScore: 530,
        chinese: 124,
      },
    ]
    arr.sort((a, b) => {
    //返回总分从大到小的排序
      return b.totalScore - a.totalScore
    })
    arr.sort((a, b) => {
      //返回总分相同时,语文成绩从大到小的排序
      return b.totalScore === a.totalScore && b.chinese - a.chinese
    })

打印结果:

1d1ac786f126785646612453fa10976.jpg

先根据一个条件进行排序,然后在第一个条件相等时再对第二个条件进行排序即可,如有多个条件需要进行排序,使用方式一致

PS:sort方法如果不传函数,直接排序的实际业务用处不大,因为根据按照转换为的字符串的各个字符的 Unicode 位点进行排序。sort方法会改变原数组,请根据场景判断是否需要深拷贝创建副本再使用