• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 本地习惯排序
2
3## 使用场景
4
5在用户使用到排序的场景下,提供符合用户使用习惯的排序方法展示内容。例如,设置中“系统和语言”的语言列表,需要按照当地用户习惯进行排序。
6
7## 开发步骤
8
9多语言列表按照当地用户习惯进行排序,通过[Collator](../reference/apis-localization-kit/js-apis-intl.md#collator8)类的[compare](../reference/apis-localization-kit/js-apis-intl.md#compare8)接口实现,具体开发步骤如下:
10
111. 导入模块。
12   ```ts
13   import { intl } from '@kit.LocalizationKit';
14   ```
15
162. 创建Collator排序对象。
17   构造函数支持通过CollatorOptions设置不同的排序格式,具体请参考表1。
18   ```ts
19   let collator: intl.Collator = new intl.Collator(locale: string | Array<string>, options?: CollatorOptions);
20   ```
21
223. 比较字符串。
23   ```ts
24   let compareResult: number = collator.compare(first: string, second: string);
25   // compareResult 为负数,表示第一个参数排在第二个参数之前
26   // compareResult 为0,表示第一个参数与第二个参数排序不分先后
27   // compareResult 为正数,表示第一个参数排在第二个参数之后
28   ```
29
30**排序格式选项**
31
32**表1** CollatorOptions各参数取值和显示效果
33
34| 名称 | 取值 | 描述 | 显示效果 |
35| -------- | -------- | -------- | -------- |
36| localeMatcher | lookup | 模糊匹配 |  |
37|  | best fit | 准确匹配 |  |
38| usage | sort | 用作排序 |  |
39|  | search | 用作查找匹配的字符串 |  |
40| sensitivity | base | 不同的字母比较不相等 | 'a' ≠ 'b', 'a' = 'á', 'a' = 'A' |
41|  | accent | 不同的字母或不同读音的相同字母比较不相等 | 'a' ≠ 'b', 'a' ≠ 'á', 'a' = 'A' |
42|  | case | 不同的字母或相同字母大小写比较不相等 | 'a' ≠ 'b', 'a' = 'á', 'a' ≠ 'A' |
43|  | variant | 不同的字母或读音及其它有区别的标志或大小写都是不相等的 | 'a' ≠ 'b', 'a' ≠ 'á', 'a' ≠ 'A' |
44| ignorePunctuation | true | 忽略标点 | 'a,b' = 'ab' |
45|  | false | 不忽略标点 | 'a,b' &lt; 'ab' |
46| numeric | true | 使用数字排序 | '1' &lt; '2' &lt; '10' &lt; '11' |
47|  | false | 不使用数字排序 | '1' &lt; '10' &lt; '11' &lt; '2' |
48| caseFirst | upper | 大写排前面 | 'AB' &lt; 'Ab' &lt; 'aB' &lt; 'ab' |
49|  | lower | 小写排前面 | 'ab' &lt; 'aB' &lt; 'Ab' &lt; 'AB' |
50|  | false | 不区分首字母大小写 | 'ab' &lt; 'aB' &lt; 'Ab' &lt; 'AB' |
51| collation | big5han | 拉丁字母使用的拼音排序 |  |
52|  | compat | 兼容性排序,仅用于阿拉伯语 |  |
53|  | dict | 词典风格排序,仅用于僧伽罗语 |  |
54|  | direct | 二进制码点排序 |  |
55|  | ducet | Unicode排序规则元素表 |  |
56|  | eor | 欧洲排序规则 |  |
57|  | gb2312 | 拼音排序,仅用于中文排序 |  |
58|  | phonebk | 电话本风格排序 |  |
59|  | phonetic | 发音排序 |  |
60|  | pinyin | 拼音排序 |  |
61|  | reformed | 瑞典语排序 |  |
62|  | searchjl | 韩语初始辅音搜索的特殊排序 |  |
63|  | stroke | 汉语的笔画排序 |  |
64|  | trad | 传统风格排序,如西班牙语 |  |
65|  | unihan | 统一汉字排序,用于日语、韩语、中文等汉字排序 |  |
66|  | zhuyin | 注音排序,仅用于中文排序 |  |
67
68**开发实例**
69
70```ts
71// 导入模块
72import { intl } from '@kit.LocalizationKit';
73
74// 创建排序对象
75let options: intl.CollatorOptions = {
76  localeMatcher: 'lookup',
77  usage: 'sort',
78  sensitivity: 'case' // 区分大小写
79};
80let collator: intl.Collator = new intl.Collator('zh-CN', options);
81
82// 区分大小写排序
83let array: Array<string> = ['app', 'App', 'Apple', 'ANIMAL', 'animal', 'apple', 'APPLE'];
84array.sort((a, b) => { // 排序后,array = ['animal', 'ANIMAL', 'app', 'App', 'apple', 'Apple', 'APPLE']
85  return collator.compare(a, b);
86})
87
88// 中文拼音排序
89array = ['苹果', '梨', '香蕉', '石榴', '甘蔗', '葡萄', '橘子'];
90array.sort((a, b) => { // 排序后,array = ['甘蔗', '橘子', '梨', '苹果', '葡萄', '石榴', '香蕉']
91  return collator.compare(a, b);
92})
93
94// 按笔画排序
95options = {
96  localeMatcher: 'lookup',
97  usage: 'sort',
98  collation: 'stroke'
99};
100let strokeCollator: intl.Collator = new intl.Collator('zh-CN', options);
101array = ['苹果', '梨', '香蕉', '石榴', '甘蔗', '葡萄', '橘子'];
102array.sort((a, b) => { // 排序后,array = ['甘蔗', '石榴', '苹果', '香蕉', '梨', '葡萄', '橘子']
103  return strokeCollator.compare(a, b);
104})
105
106// 搜索匹配的字符串
107options = {
108  usage: 'search',
109  sensitivity: 'base'
110};
111let searchCollator: intl.Collator = new intl.Collator('tr', options);
112array = ['Türkiye', 'TüRkiye', 'salt', 'bright'];
113let target: string = 'türkiye';
114// matches = ['Türkiye', 'TüRkiye']
115let matches: string[] = array.filter(item => searchCollator.compare(item, target) === 0);
116```
117