项目中有时需要对数组对象中的某个属性进行排序,属性值按照一定的规则进行排序,下面以数字-中文首字母-英文大写-英文小写的顺序进行排序进行举例。
数据:
var info = [
{id:1,name:'101路',price:'2'},
{id:2,name:'02路',price:'2'},
{id:3,name:'r11',price:'2'},
{id:4,name:'6路',price:'2'},
{id:5,name:'23路',price:'2'},
{id:6,name:'01路',price:'2'},
{id:7,name:'g2020',price:'2'},
{id:8,name:'R2018',price:'2'},
{id:9,name:'G101',price:'2'},
{id:10,name:'线路',price:'2'},
{id:11,name:'路线',price:'2'}
]
排序:
var rankArr = []
// 数字0开头
var zeroArr = info .filter((ele, index) => {
if (Number(ele.name.substr(0, 1)) === 0) {
return !isNaN(Number(ele.name.substr(0, 1)))
}
})
// 数字0开头排序
zeroArr = zeroArr.sort((a, b) => {
// return parseInt(a.name) - parseInt(b.name)
return a.name.replace(/[^0-9]/ig, '') - b.name.replace(/[^0-9]/ig, '')
})
rankArr = zeroArr
// 数字非0开头
var numArr = info .filter((ele, index) => {
if (Number(ele.name.substr(0, 1)) !== 0) {
return !isNaN(Number(ele.name.substr(0, 1)))
}
})
// 数字非0开头排序
numArr = numArr.sort((a, b) => {
return a.name.replace(/[^0-9]/ig, '') - b.name.replace(/[^0-9]/ig, '')
})
// 汉字开头
var reg = new RegExp('^[\u4e00-\u9fa5]')
var wordArr = info .filter((ele, index) => {
return reg.test(ele.name.substr(0, 1))
})
// 汉字开头排序
wordArr = wordArr.sort((a, b) => {
return a.name.localeCompare(b.name)
})
// 大写字母开头
var regUpper = /^[A-Z]+$/
var upperArr = info .filter((ele, index) => {
return regUpper.test(ele.name.substr(0, 1))
})
// 大写字母开头排序
upperArr = upperArr.sort((a, b) => {
return a.name.localeCompare(b.name)
})
// 剩余其他的开头
var otherArr = info .filter((ele, index) => {
return isNaN(Number(ele.name.substr(0, 1))) && !reg.test(ele.name.substr(0, 1)) && !regUpper.test(ele.name.substr(0, 1))
})
// 剩余其他的开头排序
otherArr = otherArr.sort((a, b) => {
return a.name.localeCompare(b.name)
})
info = rankArr
info = this.info.concat(numArr, wordArr, upperArr, otherArr)
排序结果:
可以将该排序规则封装,形参为数组和数组对象中的某个属性,使用时只要把这两个参数传进方法,然后return出排序结果。
另外,如果需要对字符串中的数字字母或汉字进行更细致的排序,那么可以在排序之后进行多次再排序得到想要的排序效果,方法还是前面那些基础的方法,根据需求进行自由组合得出一套排序规则。