简单的按照汉字和首字母分组,将数字开头的数据提取出来归类到一起
{letter: '数字开头', data:[]}
//假设一原始数据为 originArr 很常见的用户信息
let originArr = [
{phone: 13522147257, name: "张三"},
{phone: 15022147429, name: "张er"},
{phone: 15022147429, name: "张二"},
{phone: 18255726547, name: "李四"},
{phone: 13822475698, name: "alise"},
{phone: 13944125478, name: "alaen"},
{phone: 18222695475, name: "tom"},
{phone: 15033214759, name: 457},
{phone: 18755412698, name: 126},
]
将上述原始数据的格式改为:
{name: '张三', data: {name: '张三', phone: '15022147429'}}
//假设一原始数据为 originArr 很常见的用户信息 let originArr = [ {phone: 13522147257, name: "张三"}, {phone: 15022147429, name: "张er"}, {phone: 15022147429, name: "张二"}, {phone: 18255726547, name: "李四"}, {phone: 13822475698, name: "alise"}, {phone: 13944125478, name: "alaen"}, {phone: 18222695475, name: "tom"}, {phone: 15033214759, name: 457}, {phone: 18755412698, name: 126}, ] //将用户名提取出来,做成如下数据结构 data 后跟原始数据就行 // {name: '张三', data: {name: '张三', phone: '15022147429'}} let arr = [] originArr.map(item => { let tmp = item.name arr.push({'name': tmp, 'data': item}) }) function someSort(arr) { if(!String.prototype.localeCompare) return null; let letters = "*abcdefghjklmnopqrstwxyz".split(''); let zh = "阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀".split(''); let segs = []; let numArr; //如果是数字,分离出来,格式改为 numArr = {letter: '数字开头', data:[]} for (let i = 0 ; i < arr.length; i++) { //判断是不是数字开头 if (!isNaN(parseInt(arr[i].name))) { numArr.data.push(arr[i].data) arr.splice(i, 1) i-- } } letters.forEach(function(item,i){ let curr = {letter: item.toUpperCase(), data:[]}; arr.forEach(function(item2){ let it = String(item2.name) it = it.substr(0, 1) //正则验证名字的第一位是字母还是汉字 let hanzi = /[\u4E00-\u9FA5]/ let hanziFlag = hanzi.test(it) let word = /[a-zA-Z]/ let wordFlag = word.test(it) if (hanziFlag) { if((!zh[i-1] || zh[i-1].localeCompare(it,'zh') <= 0) && (it.localeCompare(zh[i], 'zh') == -1)) { curr.data.push(item2.data); } } if (wordFlag) { //统一转换为小写 it = it.toLowerCase() if(it === item) { curr.data.push(item2.data); // console.log(curr) } } }) if (curr.data.length > 0) { segs.push(curr) curr.data.sort(function(a,b){ return a.name.localeCompare(b.name,'zh'); }) } }) segs.push(numArr) return segs; } someSort(arr)
最终输出:
[ { "letter": "A", "data": [ { "phone": 13944125478, "name": "alaen" }, { "phone": 13822475698, "name": "alise" } ] }, { "letter": "L", "data": [ { "phone": 18255726547, "name": "李四" } ] }, { "letter": "T", "data": [ { "phone": 18222695475, "name": "tom" } ] }, { "letter": "Z", "data": [ { "phone": 15022147429, "name": "张二" }, { "phone": 13522147257, "name": "张三" }, { "phone": 15022147429, "name": "张er" } ] }, { "letter": "数字开头", "data": [ { "phone": 15033214759, "name": 457 }, { "phone": 18755412698, "name": 126 } ] } ]