JavaScript JS 简单方法取中文单词的简拼

dothide · 2016年02月19日 · 最后由 fubu 回复于 2016年12月17日 · 5548 次阅读

主要针对问题

中文名排序,利用中文名简拼筛选名字或其它中文单词

示例

var names = ["王思聪", "张柏芝", "郭德纲", "林志颖", "潘长江", "马云", "冯小刚"];

function getShortPinyin(word) {
  var idx = -1;
  var MAP = 'ABCDEFGHJKLMNOPQRSTWXYZ';
  var boundaryChar = '驁簿錯鵽樲鰒餜靃攟鬠纙鞪黁漚曝裠鶸蜶籜鶩鑂韻糳';

  if (!String.prototype.localeCompare) {
    throw Error('String.prototype.localeCompare not supported.');
  }

  return _(word.split('')).map(function(c) {
    if (/[^\u4e00-\u9fa5]/.test(c)) {
      return c;
    }
    for (var i = 0; i < boundaryChar.length; i++) {
      if (boundaryChar[i].localeCompare(c, 'zh-CN-u-co-pinyin') >= 0) {
        idx = i;
        break;
      }
    }
    return MAP[idx];
  }).value().join('');
}

var names_with_pinyin = _(names).map(function(name) {
    var name_with_pinyin = {
    name: name,
    pinyin: getShortPinyin(name)
  }
  return name_with_pinyin;
}).sortBy('pinyin').value();

/* Output
** 冯小刚(FXG)
** 郭德纲(GDG)
** 林志颖(LZY)
** 马云(MY)
** 潘长江(PZJ)
** 王思聪(WSC)
** 张柏芝(ZBZ)
*/

示例地址:https://jsfiddle.net/zhwrkfeh/2/

实现思路

  1. 将 Unicode 中 GBK 编码方式的字符拿来举例,可以得出连续的汉字是从 \u4e00 到 \u9fa5,因此先判断是在这个范围内的文字
  2. 将这个范围内所有文字拿出来遍历,利用拼音排序,将可以得出每个声母的边界字符:(汉字没有 I U V 这三个声母所以去掉)
  3. 利用 js 提供的字符串函数 localeCompare(需要浏览器支持)跟边界字符比较得出声母
  • 驁 (A 的最后一个)
  • 簿 (B 的最后一个)
  • 錯 (C 的最后一个)
  • 鵽 (D 的最后一个)
  • 樲 (E 的最后一个)
  • 鰒 (F 的最后一个)
  • 餜 (G 的最后一个)
  • 靃 (H 的最后一个)
  • 攟 (J 的最后一个)
  • 鬠 (K 的最后一个)
  • 纙 (L 的最后一个)
  • 鞪 (M 的最后一个)
  • 黁 (N 的最后一个)
  • 漚 (O 的最后一个)
  • 曝 (P 的最后一个)
  • 裠 (Q 的最后一个)
  • 鶸 (R 的最后一个)
  • 蜶 (S 的最后一个)
  • 籜 (T 的最后一个)
  • 鶩 (W 的最后一个)
  • 鑂 (X 的最后一个)
  • 韻 (Y 的最后一个)
  • 糳 (Z 的最后一个)

相关参考链接

  1. 《Unicode to GB2312 or GBK table》
  2. 《GB2312-80 范围》举例
    由此范围得出的字符边界示例如下:https://jsfiddle.net/zhwrkfeh/6/
  3. 「localeCompare 函数参考」

这是什么原理

看不懂,什么原理?

这个方法是可行的,我之前也用过这种方法取拼音

需要 登录 后方可回复, 如果你还没有账号请 注册新账号