var arr = [{
addSource: 0,
attachedInfo: "",
birth: 0,
createTime: 1657356961,
email: "xxxx@qq.com",
ex: "xxx",
faceURL: "https://xxx.xxx.com.cn/temp/20220419_1650350168527.jpg",
gender: 1,
nickname: "平超豪",
operatorUserID: "",
ownerUserID: "e9ca23d68d884d4ebb19d07889727dae",
phoneNumber: "",
remark: "",
userID: ""
}]


function pySegSort(arr) {

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

  letters.filter((items, i) => {
    curr = {
      initial: "", //字母
      data: [], //数据
    };
    arr.map((v, index) => {
      if (!v.nickname) return;
      // 特殊字符
      if (pattern.test(v?.nickname[0])) {
        if ((!zh[i - 1] || zh[i - 1].localeCompare(v?.nickname) <= 0) && v?.nickname.localeCompare(zh[i]) == -1) {
          curr.data.push(v);
        }
      }
      // 判断首个字是否是中文
      if (re.test(v?.nickname[0])) {
        // 英文
        if (v?.nickname[0].toUpperCase() == items) {
          curr.data.push(v);
        }
      } else {
        // 中文
        if ((!zh[i - 1] || zh[i - 1].localeCompare(v?.nickname) <= 0) && v?.nickname.localeCompare(zh[i]) == -1) {
          curr.data.push(v);
        }
      }
    });

    if (curr.data.length) {
      curr.initial = letters[i];
      
      segs.push(curr);
      curr.data.sort((a: any, b: any) => {
        return a.nickname.localeCompare(b.nickname);
      });
    }
  });
  res.segs = Array.from(new Set(segs)); //去重
  console.log(res.segs, res);
  const lastData = res.segs.shift();
  debugger
  if (lastData.initial == "#") {
    res.segs.push(lastData);
  }else{
    res.segs.unshift(lastData);
  }

  return res;
};

GWO