记录JS中的sort()排序

文章讲述了JavaScript中sort()函数在处理数组时的行为,特别关注了中文、字符串和数字排序的情况,介绍了如何自定义比较函数对中文进行排序的方法。
摘要由CSDN通过智能技术生成

在之前算法学习的时候,常用到sort,印象中sort是按照转化unicode进行排序的。

学习一下sort()吧
      const arr = [
        { name: "小红", subject: "语文", age: 16, score: "90", rank: "一" },
        { name: "小黄", subject: "数学", age: 18, score: "70", rank: "七" },
        { name: "小蓝", subject: "语文", age: 19, score: "60", rank: "六" },
        { name: "小绿", subject: "数学", age: 17, score: "80", rank: "八" },
      ];

      // 以为能够语文能和语文排在一起,其实不能,看看打印什么
      arr.sort((a, b) => a.subject - b.subject);
      console.log(arr, "arr-subject");

      // 实际上,如果按照年龄排序,是可以的
      arr.sort((a, b) => a.age - b.age);
      console.log(arr, "arr-age");

      // 如果是可以转化为数字的字符串呢?注意这里,其实不行,因为是按unicode排序,首位直至末尾,而不是大小排序,10 100 1000 500 60 
      arr.sort((a, b) => a.score - b.score);
      console.log(arr, "arr-score");
      const arr2 = ["1000", "500", "10", "100", "60"];
      arr2.sort();
      console.log(arr2, "arr2");

      // 如果是大写中文数字呢,
      arr.sort((a, b) => a.rank - b.rank);
      console.log(arr, "arr-rank");
打印结果:

从结果看,改变了原数组,呈现结果是这样的
  1. 字符串中文与字符串中文大写数字不能排序,如:”小明,十”等
  2. 可以转化为数字的字符串也不可以,如:“'10','2','3'”等,10会排在2、3前
  3. 数字可以,如:“1,2,3”
  4. 如果第一个参数比第二个参数,比较函数应该返回一个负数,那么第一个参数会被排序到第二个参数之前

  5. 如果第一个参数比第二个参数,比较函数应该返回一个正数,那么第一个参数会被排序到第二个参数之后

  6. sort()可以用在基础数据类型的数组排序,如果是对象里的内容进行排序,则是需要进行两个参数的比较返回正负数的。

如何对中文进行排序呢?

function compare(a, b) {
  // 转换为字符数组
  if (!a || !b) return 0;
  for (let i = 0; i < a.length && i < b.length; i += 1) {
    // 比较unicode编码
    const unicodeA = a.charCodeAt(i);
    const unicodeB = b.charCodeAt(i);
    if (unicodeA !== unicodeB) {
      return unicodeA - unicodeB;
    }
  }
  // 如果所有字符都相同,则长度短的排在前面
  return a.length - b.length;
}

// 使用
list.sort((a, b) => compare(a, b))

以上

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值