中文汉字拼音排序之使用localeCompare和CONVERT(sortWord USING gbk)前后端操作


prtyaa
prtyaa 2023-12-26 18:34:42 53011
分类专栏: 资讯

正常后端的SQL排序

  • 正常排序,前端发请求,将排序字段和排序方式(升序or降序)传给后端
  • 后端接口收到相关参与,执行SQL语句查询数据库并返回,如:
  • SELECT * FROM table ORDER BY ${req.query.sortWord} ${req.query.sortOrder}

若是排序中夹杂着中文排序,如笔者的这个网站效果:

效果图如下:

  • 就要使用ORDER BY CONVERT(ColumnName USING gbk)函数了
  • 后端直接把前端的请求参数拼接sql,执行即可

如:select * from table ORDER BY CONVERT( ${req.query.sortWord} USING gbk ) ${req.query.sortOrder}

某些情况中文拼音排序

  • 某些场景下,需要前端去使用中文拼音去进行排序
  • 前端是没有sql语句能够用的,不过js提供了一个localCompare方法可使用

localCompare方法

  • local是当地的意思
  • compare是比较的意思
  • 就是用当地的语言编码字符习惯进行比较
中文就是拼音前后比较【带四声前后】
let str1 = '阿'
let str2 = '波'
let str3 = '词'
let result1 = str1.localeCompare(str2)
let result2 = str2.localeCompare(str1)
let result3 = str3.localeCompare(str3)

console.log('result1', result1); // -1
console.log('result2', result2); // 1
console.log('result3', result3); // 0

/*
    返回 -1 代表 按照拼音顺序 '阿'排在'波'前面
    返回 1 代表 按照拼音顺序 '波'排在'阿'前面
    返回 0 代表 按照拼音顺序 位置相同
*/
  • 搭配sort方法就可以实现中文排序了
  • 为了更直观的看到效果,笔者写了一个小demo
  • 如下效果图

案例效果图

动图封面
 

案例demo代码

复制粘贴跑一下,顺带回顾一下js知识

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button>点击切换排序</button>
    <h2 label="标题">---排序---</h2>
    <script>
        // 获取当前页面的最后一个h2元素
        function getLastH2() {
            const h2List = document.querySelectorAll('h2')
            return Array.from(h2List).at(-1)
        }

        // 把新dom元素追加在目标dom元素后【原生js只有insertBefore方法,insertAfter要自己写】
        function insertAfter(newDom, targetDom) {
            let parent = targetDom.parentNode; // 得到父级元素
            if (parent.lastChild == targetDom) {
                // 若当前目标元素是最后一个,直接追加即可
                parent.appendChild(newDom);
            } else {
                // 若当前目标不是最后一个,就在目标的后面之前加一个(即往后平级追加)
                parent.insertBefore(newDom, targetDom.nextSibling);
            }
        }

        // 清空除去label的所有h2
        function removeH2WithoutLabel() {
            const h2List = document.querySelectorAll('h2')
            Array.from(h2List).forEach((h2) => {
                if (!h2.hasAttribute('label')) {
                    h2.parentNode.removeChild(h2);
                }
            })
        }

        let isAsc = true // 默认拼音正序
        const btn = document.querySelector('button')

        let textArr = ['阿', '波', '词', '得', '鹅', '佛', '格', '河']

        btn.onclick = () => {
            removeH2WithoutLabel()
            textArr.sort((a, b) => {
                if (isAsc) {
                    return a.localeCompare(b) // 正序
                } else {
                    return b.localeCompare(a) // 倒序
                }
            });
            isAsc = !isAsc
            textArr.forEach((text) => {
                let h2Dom = document.createElement('h2')
                h2Dom.innerText = text
                const lastH2 = getLastH2()
                insertAfter(h2Dom, lastH2)
            })
        }
    </script>
</body>

</html>

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31020
赞同 0
评论 0 条
prtyaaL2
粉丝 1 发表 2553 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2980
【软件正版化】软件正版化工作要点  2897
统信UOS试玩黑神话:悟空  2872
信刻光盘安全隔离与信息交换系统  2758
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1291
grub引导程序无法找到指定设备和分区  1262
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  171
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  169
点击报名 | 京东2025校招进校行程预告  165
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  164
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!