forked from xiuhuwang/pinyin4js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpinyin.js
129 lines (116 loc) · 3.2 KB
/
pinyin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import unicodeToPinyinJson from './unicode_to_pinyin4.js';
class Translate{
constructor(){
}
/**
* @param {string} name
*/
go(name){
if (!name) return;
var arrs;
arrs = this.ToUnicodeWithoutTitle(name);
arrs = this.ToPinYin(arrs);
arrs = this.removeTone(arrs);
arrs = this.permutation(arrs);
return arrs;
}
/**
* 去除音调,再去重
* @param {array} arrs
*/
removeTone(arrs){
return arrs.map(item => {
item = item.join('').split(/\d/);
if(!(item.length == 1)) item.pop();
return Array.from(new Set(item));
})
}
/**
* 排列组合
* @param {array} arrs
*/
permutation(arrs){
var arrL = arrs.length;
var group = [];
/**
* 循环体
* @param {array} item
* @param {number} i
* @param {string} str
* @return {array} {{所有可能的排列}}
*/
var loop = (item, i, str) => {
var arr;
if (!str) {
arr = [];
} else {
arr = str.split(',')
}
for(var k = 0, l = item.length; k < l; k++){
if (!str) {
arr = [];
} else {
arr = str.split(',')
} //重置arr 避免push多个值
arr.push(item[k]);
var temp = arr.join(',');
var t = i;
if(i == arrL-1)
group.push(arr.join(','));
if(i < arrL-1)
loop(arrs[++t], t, temp);
}
};
loop(arrs[0], 0);
return group.map(item => item.split(',').join('').toLowerCase());
}
/**
*根据传入的汉字的Unicode编码数组,查找拼音
* @param Array
*/
ToPinYin(array){
var pinyinArray = new Array();
for (var index in array) {
pinyinArray.push(this.findPinyinByUnicode(array[index]));
}
return pinyinArray;
}
/**
* 把汉字转换为Unicode字符,初始版本使用了escape()函数,后续修改
* @param str
* @returns {string}
*/
ToUnicode(str){
return escape(str).replace('%u', '').toUpperCase();
}
UnUnicode(str){
return unescape(str.replace(/\\/g, "%"));
}
ToUnicodeWithoutTitle(str){
var result = []; // 用于保存结果
// var pre = ''; // 用于保存连续非汉字
var i, l, item;
for(i = 0, l = str.length; i < l; i++){
if(str[i] === ' ') {
continue;
}
item = this.ToUnicode(str[i]);
result.push(item)
}
return result;
}
/**
* 根据Unicode查找拼音,由于多音字的存在,返回数组
* @param str
* @returns {*|unicodeToPinyinJson.pinyin}
*/
findPinyinByUnicode(str){
for (var i in unicodeToPinyinJson) {
if (str == unicodeToPinyinJson[i].unicode) {
return unicodeToPinyinJson[i].pinyin;
}
}
return [str];
}
}
export default new Translate();