先说逻辑:将日语转成罗马音(借助 romaji.js ),根据罗马音分组 排序,罗马音转成平假名生成索引(如需按行分组,可以替换合并各列,即あ い う え お 都归属 あ 行这个索引)
npm安装使用
npm install romaji
bower安装使用
bower install romaji
用法
romaji.fromKana('ローマ'); //return 'rōma' //罗马音
romaji.toHiragana('tsuzuku'); // return 'つづく' //平假名
romaji.toKatakana('chāhan'); //return 'チャーハン' //全角片假名
代码:
import romaji from "romaji"
let _ = require('lodash');
var list = ['アルスヴ','エクスト','ヴィル','スウェ','トルネオ','モロッコ'];
list.sort();
// 分组这里使用了lodash,根据返回值 进行分组
let sortJson = _.groupBy(list,function(item){
let indexes = item.charAt(0).toUpperCase();
// 首字符是日文 平假名 片假名 半角片假名 A-Z
if(indexes.match(/[\u3040-\u309f\u30a0-\u30ff\uff66-\uff9f]/)!==null){
// 转全角片假名(如果有半角片假名时) 借助kana.js
//(https://github.com/shogo4405/KanaXS)
//indexes = indexes.toZenkanaCase();
let roma = romaji.fromKana(indexes); //转罗马音
if(indexes == roma){//fail roma
indexes = item.slice(0,2);
roma = romaji.fromKana(indexes); //转罗马音
}
if(roma.length==3){//lqxy
roma = roma[0] + roma[2];
}
// 特殊发音 特殊处理
roma = roma.replace('f','h');
roma = roma.replace('c','t');
roma = roma.replace('j','s');
// vi ve we 归u音 a行
roma = roma.replace(/[wv]/,'');
// 浊辅音转清辅音
roma = roma.replace('g','k');
roma = roma.replace('z','s');
roma = roma.replace('d','t');
roma = roma.replace('b','h');
roma = roma.replace('p','h');
// a i u e o 列合并到a列
roma = roma.replace(/[iueo]/,'a');
indexes = romaji.toHiragana(roma); //索引 平假名
}else if(indexes.match(/[A-Z]/)==null){ //非字母
indexes = '#'
}
return indexes;
});
console.log(sortJson)
{
"あ": [
"アルスヴ",
"エクスト",
"ヴィル"
],
"さ": [
"スウェ"
],
"た": [
"トルネオ"
],
"ま": [
"モロッコ"
]
}
日文Unicode码参照表:Unicode Kanji Code Table