Js根据拼音首字母分组

本文介绍了如何使用JavaScript根据汉字拼音首字母进行分组和排序的详细方法,适用于字符处理场景,如数据预处理或拼音搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一下Js根据拼音首字母分组的方法
引自https://segmentfault.com/a/1190000017321316
如有侵权请联系。

const pySegSort=(arr) =>{
    if (!String.prototype.localeCompare) return null
    // let letters = 'abcdefghjklmnopqrstwxyz'.split('')
    let letters = 'ABCDEFGHJKLMNOPQRSTWXYZ'.split('')
    let zh = '阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀'.split('')
    let segs = []
    letters.forEach((item, i) => {
        let cur = { letter: item, data: [] }
        arr.forEach((item) => {
            if(item.localeCompare(zh[i])>=0&&item.localeCompare(zh[i+1])<0){
                cur.data.push(item)
            }         
        })
        if (cur.data.length) {   
                cur.data.sort(function(a, b) {
                    return a.localeCompare(b, 'zh')
                })
                segs.push(cur)
            }
    })

    return segs
}

console.log(pySegSort(['白案','百搭','白菜','百旺','王','李','张','刘','陈','杨','黄','吴','赵','周','的','徐','孙','马','朱','胡','林','郭','何','高','罗','','郑','梁','谢','宋','唐','许','邓','冯','韩','曹','曾','彭','白大','萧','蔡','F','潘','田','董','袁','于','余','','叶','蒋','杜','苏','魏','程','吕','丁','沈','任','白','卞']))

结果

[
  {
    letter: 'B',
    data: [
      '白',   '白案',
      '白菜', '白大',
      '百搭', '百旺',
      '卞'
    ]
  },
  { letter: 'C', data: [ '蔡', '曹', '曾', '沈', '陈', '程' ] },
  { letter: 'D', data: [ '的', '邓', '丁', '董', '杜' ] },      
  { letter: 'F', data: [ '冯' ] },
  { letter: 'G', data: [ '高', '郭' ] },
  { letter: 'H', data: [ '韩', '何', '胡', '黄' ] },
  { letter: 'J', data: [ '蒋' ] },
  { letter: 'L', data: [ '李', '梁', '林' ] },
  { letter: 'M', data: [ '刘', '吕', '罗', '马' ] },
  { letter: 'P', data: [ '潘', '彭' ] },
  { letter: 'R', data: [ '任' ] },
  { letter: 'S', data: [ '宋', '苏', '孙' ] },
  { letter: 'T', data: [ '唐', '田' ] },
  { letter: 'W', data: [ '王', '魏', '吴' ] },
  { letter: 'X', data: [ '萧', '谢', '徐', '许' ] },
  { letter: 'Y', data: [ '杨', '叶', '于', '余', '袁' ] },
  { letter: 'Z', data: [ '张', '赵', '郑', '周', '朱', 'F' ] }
]
### JavaScript 按照名字首字母分组的实现方法 在 JavaScript 中,可以通过使用 `localeCompare` 方法对汉字拼音进行排序,并结合首字母分组逻辑来实现按照名字首字母分组的功能。以下是一个完整的实现示例: #### 1. 数据准备 假设我们有一个包含多个对象的数组,每个对象都有一个 `name` 属性,表示人的姓名。 ```javascript const data = [ { id: 1, name: '张三' }, { id: 2, name: '李四' }, { id: 3, name: '王五' }, { id: 4, name: '赵六' }, { id: 5, name: '周七' } ]; ``` #### 2. 获取汉字拼音首字母 为了获取汉字的拼音首字母,可以使用内置的 `localeCompare` 方法或引入第三方库(如 `pinyin.js`)。这里以简单的拼音对照表为例[^2]。 ```javascript // 拼音首字母对照表 const pinyinMap = { '阿': 'A', '八': 'B', '嚓': 'C', '哒': 'D', '妸': 'E', '发': 'F', '旮': 'G', '哈': 'H', '讥': 'J', '咔': 'K', '垃': 'L', '痳': 'M', '拏': 'N', '噢': 'O', '妑': 'P', '七': 'Q', '呥': 'R', '扨': 'S', '它': 'T', '穵': 'W', '夕': 'X', '丫': 'Y', '帀': 'Z' }; // 获取汉字拼音首字母 function getFirstLetter(name) { const firstChar = name[0]; for (let key in pinyinMap) { if (firstChar.localeCompare(key) >= 0 && firstChar.localeCompare(Object.keys(pinyinMap)[Object.keys(pinyinMap).indexOf(key) + 1]) < 0) { return pinyinMap[key]; } } return '#'; // 如果无法匹配,则归为其他类别 } ``` #### 3. 按照首字母分组 通过遍历数据并根据首字母进行分组,最终生成一个以首字母为键的对象。 ```javascript function groupByFirstLetter(data) { return data.reduce((result, item) => { const letter = getFirstLetter(item.name); if (!result[letter]) { result[letter] = []; } result[letter].push(item); return result; }, {}); } const groupedData = groupByFirstLetter(data); console.log(groupedData); ``` #### 4. 排序与展示 将分组后的数据按首字母顺序排序,并生成适合展示的结构。 ```javascript function sortAndFormat(data) { return Object.entries(data) .sort((a, b) => a[0].localeCompare(b[0])) .map(([letter, items]) => ({ letter, items })); } const formattedData = sortAndFormat(groupedData); console.log(formattedData); ``` #### 5. 完整代码示例 以下是完整代码示例,包括数据准备、分组、排序和格式化。 ```javascript const data = [ { id: 1, name: '张三' }, { id: 2, name: '李四' }, { id: 3, name: '王五' }, { id: 4, name: '赵六' }, { id: 5, name: '周七' } ]; // 拼音首字母对照表 const pinyinMap = { '阿': 'A', '八': 'B', '嚓': 'C', '哒': 'D', '妸': 'E', '发': 'F', '旮': 'G', '哈': 'H', '讥': 'J', '咔': 'K', '垃': 'L', '痳': 'M', '拏': 'N', '噢': 'O', '妑': 'P', '七': 'Q', '呥': 'R', '扨': 'S', '它': 'T', '穵': 'W', '夕': 'X', '丫': 'Y', '帀': 'Z' }; // 获取汉字拼音首字母 function getFirstLetter(name) { const firstChar = name[0]; for (let key in pinyinMap) { if (firstChar.localeCompare(key) >= 0 && firstChar.localeCompare(Object.keys(pinyinMap)[Object.keys(pinyinMap).indexOf(key) + 1]) < 0) { return pinyinMap[key]; } } return '#'; } // 按照首字母分组 function groupByFirstLetter(data) { return data.reduce((result, item) => { const letter = getFirstLetter(item.name); if (!result[letter]) { result[letter] = []; } result[letter].push(item); return result; }, {}); } // 排序与格式化 function sortAndFormat(data) { return Object.entries(data) .sort((a, b) => a[0].localeCompare(b[0])) .map(([letter, items]) => ({ letter, items })); } const groupedData = groupByFirstLetter(data); const formattedData = sortAndFormat(groupedData); console.log(formattedData); ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值