vue3 字符串排序 localeCompare,确保排序为 “B01“, “B10“, “B2“

代码示例:

TypeScript 复制代码
  // ========== 计算属性(Getters) ==========
  /**
   * 按 acceptTypeCode 去重后的受理类别键值对列表(仅包含编码和名称)
   * 并按 acceptTypeCode 自然排序(数字部分按数值比较,确保排序为 "B01", "B10", "B2")
   */
  const acceptTypeKeyValues = computed(() => {
    const seen = new Set<string>();
    return acceptTypeOptions.value
      .map((item) => ({
        acceptTypeCode: item.acceptTypeCode,
        acceptTypeName: item.acceptTypeName
      }))
      .filter((item) => {
        if (seen.has(item.acceptTypeCode)) return false;
        seen.add(item.acceptTypeCode);
        return true;
      })
      .sort((a, b) =>
        // 第二个参数:undefined:指定 locale(语言环境)。传入 undefined 表示使用运行时默认的 locale(通常由浏览器或 Node.js 环境决定)。
        a.acceptTypeCode.localeCompare(b.acceptTypeCode, undefined, {
          numeric: true, // 启用自然数字排序。例如 "B2" 会被排在 "B10" 前面,因为数字部分按数值 2 < 10 比较,而不是逐字符比较(否则 "B10" 会排在 "B2" 前)。
          sensitivity: "base" // 设置字符串比较的敏感度。"base" 表示只比较基本字符,忽略大小写和重音符号。例如 "a" 和 "A" 被认为是相等的,"é" 和 "e" 也被视为相等。
        })
      );
  });

这段代码是一个字符串排序比较函数,用于 Array.prototype.sort() 的回调中。它调用字符串的 localeCompare 方法,并传入一些选项来控制比较行为。具体解释如下:

代码分解

ts

复制代码
a.acceptTypeCode.localeCompare(b.acceptTypeCode, undefined, {
  numeric: true,
  sensitivity: "base"
})
  • a.acceptTypeCode:当前元素的值。

  • b.acceptTypeCode:下一个元素的值。

  • localeCompare:JavaScript 字符串方法,返回一个数字(负数、0 或正数),表示两个字符串在本地化排序中的相对顺序。

  • 第二个参数 undefined :指定 locale(语言环境)。传入 undefined 表示使用运行时默认的 locale(通常由浏览器或 Node.js 环境决定)。

  • 第三个参数:选项对象

    • numeric: true:启用自然数字排序。例如 "B2" 会被排在 "B10" 前面,因为数字部分按数值 2 < 10 比较,而不是逐字符比较(否则 "B10" 会排在 "B2" 前)。

    • sensitivity: "base":设置字符串比较的敏感度。"base" 表示只比较基本字符,忽略大小写和重音符号。例如 "a""A" 被认为是相等的,"é""e" 也被视为相等。

作用总结

这个表达式用于对 acceptTypeCode 进行自然排序 (数字按数值大小,字母不区分大小写)。它返回一个值,供 sort 方法决定元素的先后顺序。

示例

假设有数组 ["B10", "B2", "B01"],使用此比较函数排序后得到 ["B01", "B2", "B10"],符合人类直觉。

与普通 localeCompare 的区别

  • 不带选项localeCompare 默认按字典序比较,结果可能是 ["B01", "B10", "B2"],因为字符 '1' 的 Unicode 码点小于 '2'。

  • 加了 numeric: true:数字部分按数值比较,得到更自然的顺序。

  • 加了 sensitivity: "base" :忽略大小写差异,例如 "b2""B2" 排序时视为相同。

因此,这个表达式提供了更符合业务习惯的排序方式,特别适合编码包含数字和字母的情况。

相关推荐
一鸣AI编程1 小时前
功能用例接入 TestStar AI UI:一份可执行的接入清单
前端
Nayana1 小时前
《Web 到 HarmonyOS》-- 第一课:前端经验哪些能带走
vue.js·harmonyos
晴天161 小时前
打造自己的 npm 包实战指南
前端·npm·node.js
然我1 小时前
从 Service 到生命周期:Agent Runtime 的插件内核
前端·javascript·agent
Moriarty1236661 小时前
【前端技巧】实现卡片页面容器全屏
前端·css
mmsx2 小时前
osmdroid 地图实战 02|在线底图接入:从 URL 模板到生产级瓦片源工厂(谷歌 + 天地图双案例)
前端·前端框架
用户307140958482 小时前
零依赖实现「形切形」:我用 6200 行原生 Canvas 写了个网页设计工具
前端·ai编程·canvas
用户6919026813392 小时前
Agent 记忆处理机制详解:从变量数据类型到内存模型
javascript·架构