Web前端之汉字排序、sort与localeCompare的介绍、编码顺序与字典顺序的区别

使用字典顺序对汉字进行排序(不支持多音字)

不使用拼音库,利用JavaScript的localeCompare方法直接按汉字的字典序排序。localeCompare可以在比较字符串时指定语言及排序规则,它对中文字符排序时,会默认按拼音顺序排列。

javascript 复制代码
const arr = ['南宁', '河池', '柳州', '桂林', '贺州', '梧州'];
const list = [
    {
        id: 1,
        title: '南宁'
    },
    {
        id: 2,
        title: '河池'
    },
    {
        id: 3,
        title: '柳州'
    },
    {
        id: 4,
        title: '桂林'
    },
    {
        id: 5,
        title: '贺州'
    },
    {
        id: 6,
        title: '梧州'
    }
];
let newArr = arr.sort((a, b) => a.localeCompare(b, 'zh-Hans-CN'));
let newList = list.sort((a, b) => a.title.localeCompare(b.title, 'zh-Hans-CN'));

console.log(newArr);
// ["桂林", "河池", "贺州", "柳州", "南宁", "梧州"]
console.log(newList);
// [
//     {
//         "id": 4,
//         "title": "桂林"
//     },
//     {
//         "id": 2,
//         "title": "河池"
//     },
//     {
//         "id": 5,
//         "title": "贺州"
//     },
//     {
//         "id": 3,
//         "title": "柳州"
//     },
//     {
//         "id": 1,
//         "title": "南宁"
//     },
//     {
//         "id": 6,
//         "title": "梧州"
//     }
// ]

在示例中,使用localeCompare的第二个参数'zh-Hans-CN',指定简体中文和中国的排序规则。localeCompare会根据拼音顺序排序汉字,而不需要任何额外的拼音库。
sort方法接受一个比较函数,localeCompare用于比较两个字符串的字典顺序。
'zh-Hans-CN'指定简体中文的语言和地区代码,以确保对汉字进行拼音顺序排序。
这种方法在大多数现代浏览器和Node.js环境中都支持。


编码顺序和字典顺序的区别

编码顺序和字典顺序是两种不同的排序方式,特别是在处理中文字符时,这两种顺序差异显著。


1、编码顺序
编码顺序基于字符在计算机字符集(如Unicode)中的编码值来排序。在编码顺序中,字符的位置和大小顺序完全由它的编码值决定,而不考虑字符的语言或意义。

原理
计算机将每个字符映射为一个二进制数值,称为编码。对于中文字符来说,Unicode会为每个汉字分配一个独特的编码。因此,当按编码顺序排列汉字时,实际上是按照它们的编码值大小从小到大排列。

特点
编码顺序是纯粹的二进制排序,不涉及语言的语义。
对于同一字符集(如Unicode)中的字符,这种排序方式非常快,但对中文用户来说没有任何实际的语义或拼音顺序可言。
假设有汉字列表["张", "王", "李", "赵"],编码顺序可能会排列成["李", "王", "张", "赵"],因为它们在Unicode表中的顺序就是这样,但这并不符合字典或拼音顺序。

适用场景
这种排序方式在需要统一编码的场景中有用,例如存储或快速查找数据。但它不适合用户展示,因为不符合直观的语言排序。


2、字典顺序
字典顺序是基于自然语言的排序方式。在中文中,字典顺序可以基于拼音顺序或部首笔画顺序,这两种方法可以在实际使用中帮助人们更容易地找到和整理文字。


2.1、拼音顺序
这是现代电子设备和软件最常用的字典顺序,基于汉字的拼音字母排序。

原理
每个汉字可以被转换成拼音,按拼音的字母顺序排列汉字列表。拼音字母较小的字在前,较大的字在后。

例子
对于同一列表["张", "王", "李", "赵"],按拼音排序会得到["李", "王", "张", "赵"],符合中文字典的拼音查找顺序。


2.2、部首笔画顺序
这是传统字典中常用的另一种顺序,基于汉字的部首和笔画数。

原理
首先按部首排列,然后按剩余笔画数从少到多排序。需要根据每个汉字的部首和笔画数进行对比。

例子
如果用部首笔画法排序同样的列表["张", "王", "李", "赵"],结果可能会是["李", "王", "赵", "张"],取决于部首的顺序以及剩余笔画数。


3、编码顺序与字典顺序的对比

特点 编码顺序 字典顺序
排序依据 字符编码的数值 自然语言的拼音或部首笔画
是否符合直觉 否,不考虑语言语义 是,更符合人类阅读和查找习惯
计算速度 快,按二进制数值排序 较慢,需要语言规则和转换
适用场景 原始数据处理、索引等 用户展示、文字查找等

4、JavaScript示例
在JavaScript中,可以利用localeCompare来实现字典顺序的拼音排序,而编码顺序可以直接使用sort方法按Unicode编码排序。


编码顺序

javascript 复制代码
const words = ["张", "王", "李", "赵"];

words.sort();
console.log(words);  
// ["李", "王", "张", "赵"]

字典顺序(拼音)

javascript 复制代码
const words = ["张", "王", "李", "赵"];

words.sort((a, b) => a.localeCompare(b, 'zh-Hans-CN'));
console.log(words);  
// ["李", "王", "张", "赵"]

localeCompare指定简体中文的排序规则,可以按照拼音顺序对汉字排序。


5、总结
编码顺序基于字符的二进制编码值,快速但不符合直观语言规则。
字典顺序基于拼音或部首笔画,符合人类查阅习惯,但需要更多计算和语言支持。
在实际应用中,字典顺序更符合用户的需求,编码顺序更适合数据的内部存储。


sort与localeCompare的介绍

sort和localeCompare是JavaScript中两个与排序相关的功能,但它们的工作方式和适用场景有所不同。


1、sort方法
Array.prototype.sort() 是 JavaScript 用来对数组进行排序的方法,它可以直接对数组中的元素按编码顺序进行排序,也可以通过传递比较函数自定义排序规则。
工作原理
默认排序:如果sort不传入任何参数,则按编码顺序(即字符串的Unicode编码)进行排序,这对数字或字符串的基本排序是有效的,但对中文和其他语言符号排序可能会显得混乱。
自定义排序:可以向sort传递一个比较函数自定义排序规则。比较函数应返回一个负数、零或正数,分别表示较小、相等或较大,用于确定元素的排序。

示例

javascript 复制代码
// 编码顺序(默认排序)
const words = ["张", "王", "李", "赵"];

words.sort();
console.log(words);  
// ["李", "王", "张", "赵"]

// 自定义排序(如按长度排序)
const numbers = [1, 5, 2, 10];

numbers.sort((a, b) => a - b);
console.log(numbers);  
// 1, 2, 5, 10]

特点
默认编码顺序:sort默认使用编码顺序排序,可能不符合特定语言的字典排序规则。
需要提供比较函数:为了实现更复杂的排序逻辑,通常会结合localeCompare等方法来提供比较函数。


2、localeCompare方法
String.prototype.localeCompare()是JavaScript中用于比较两个字符串的方法,支持指定语言及排序规则。localeCompare会根据区域语言的特定排序规则来确定字符串的顺序,因此适合处理自然语言中的排序问题。
工作原理
localeCompare方法会比较两个字符串,并返回负数、0或正数。
负数:表示当前字符串在排序中应排在参数字符串之前。
0:表示两个字符串在排序中位置相同。
正数:表示当前字符串在排序中应排在参数字符串之后。
可以为localeCompare指定语言和地区(如zh-Hans-CN),从而按照拼音顺序对中文字符进行排序。
示例

javascript 复制代码
// 使用localeCompare比较字符串的字典顺序
const words = ["张", "王", "李", "赵"];

words.sort((a, b) => a.localeCompare(b, 'zh-Hans-CN'));
console.log(words);
// ["李", "王", "张", "赵"]

特点
按语言排序规则:localeCompare能够根据指定的语言进行排序,适用于需要特定语言字典顺序的场景。
自定义灵活性:通过在localeCompare中指定不同的区域代码,可以对多语言内容进行排序。


3、sort和localeCompare的组合使用
在实际应用中,sort常常和localeCompare结合使用,以实现多语言环境中的自然排序。sort负责排序的整体流程,而localeCompare提供特定的语言比较规则。

javascript 复制代码
const words = ["苹果", "香蕉", "橙子", "菠萝", "西瓜"];

words.sort((a, b) => a.localeCompare(b, 'zh-Hans-CN'));
console.log(words);
// ["菠萝", "橙子", "苹果", "西瓜", "香蕉"]

4、总结对比

特性 sort localeCompare
主要用途 对数组进行排序 比较两个字符串的顺序
默认行为 按编码顺序(Unicode)排序 按指定语言的字典序进行比较
适合语言 对多语言支持较弱 支持多语言排序
是否传入参数 可选传入比较函数 可指定语言和比较选项
常见组合 与localeCompare结合使用以实现自然语言排序 用作sort的比较函数

5、使用场景建议
如果只是简单的编码排序,可以直接使用sort()。
如果需要按语言规则排序(如拼音),使用sort((a, b) => a.localeCompare(b, '语言'))。

相关推荐
吃杠碰小鸡21 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone21 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_090121 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农21 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king1 天前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳1 天前
JavaScript 的宏任务和微任务
javascript
夏幻灵1 天前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星1 天前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_1 天前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝1 天前
RBAC前端架构-01:项目初始化
前端·架构