将数组按 a-z 排序

/**
 * 将数组按 a-z 排序
 * 返回格式 { segs:[{ initial: 'a-z', data: [原数据 1, 原数据 2...] }] }
 * 参数格式 [{titleName: 'xxx'}]
 */
export function azSort(arr) {
  if (arr.length === 0) return
  if (!String.prototype.localeCompare) return null
  var letters = '*ABCDEFGHJKLMNOPQRSTWXYZ'.split('')
  var zh = '阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀'.split('')
  var segs = [] // 存放数据
  var res = {}
  let curr
  var re = /[^\u4e00-\u9fa5]/// 中文正则
  var pattern = new RegExp('[`\\-~!@#$^&*()=|{}\':;\',\\[\\].<>《》/?~!@#¥……&*()——|{}【】‘;:”“\'。,、?12345678990]') // 特殊符号

  letters.filter((items, i) => {
    curr = {
      initial: '', // 字母
      data: []  // 数据
    }
    arr.map((v, index) => {
      // 特殊字符
      if (pattern.test(v.titleName[0])) {
        if ((!zh[i - 1] || zh[i - 1].localeCompare(v.titleName) <= 0) && v.titleName.localeCompare(zh[i]) === -1) {
          curr.data.push(v)
        }
      }
      // 判断首个字是否是中文 
      if (re.test(v.titleName[0])) {
        // 英文 
        if (v.titleName[0].toUpperCase() === items) {
          curr.data.push(v)
        }
      } else {
        // 中文
        if ((!zh[i - 1] || zh[i - 1].localeCompare(v.titleName) <= 0) && v.titleName.localeCompare(zh[i]) === -1) {
          curr.data.push(v)
        }
      }
    })
    if (curr.data.length) {
      curr.initial = letters[i]
      segs.push(curr)
      curr.data.sort((a, b) => {
        return a.titleName.localeCompare(b.titleName)
      })
    }
  })
  res.segs = Array.from(new Set(segs)) // 去重
  return res
}

 

版权声明:
作者:灰糖
链接:https://longdada.me/jszaazpx/
来源:灰糖笔记
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>