javascript 的数组有一个排序的功能 sort,但是在很多时候靠比大小并不能满足我们的需求。
比如: 字符串的排序, 我们以为:a10 > a9, 但是js 判断出来确是a9 > a10
万能排序的思想是,把字符串和数字分离开来。
比如 a9, a10, b8 进行排序。
我们把他们拆分成 [a, 9] [a, 10] [b, 8] 再通过相同的下标位来比大小,如果相等再比下一个。
自然排序之后就会变成我们想要的样子 a9, a10, b8
Arr.sort((lhs, rhs) => {
var intOrString = (s) => {
var n = parseInt(s)
return isNaN(n) ? s : n
}
let lhsArr = lhs.toString().split(/(\d+)/).map(intOrString)
let rhsArr = rhs.toString().split(/(\d+)/).map(intOrString)
var isLower = true
for (var i = 0; i < lhsArr.length; i++) {
if (i >= rhsArr.length) {
break
} else if (lhsArr[i] !== rhsArr[i]) {
isLower = lhsArr[i] < rhsArr[i]
break
}
}
return isLower ? -1 : 1
})
当然了,这个函数貌似过于简单, 实际上我们遇到的情景一般是这样的:
一个表格数据, 然后排序自然是根据 name, age, sex, buy的某一个进行排序。
[
{name: '1-1', age: 25, sex: 'gril', buy: 'a1-9'},
{name: '1-10', age: 24, sex: 'man', buy: 'b1-9'},
{name: '3-10', age: 22, sex: 'gril', buy: 'a1-11'},
{name: '3-8', age: 21, sex: 'man', buy: 'c1-3'}
]
OK, 我们接下来对我们的排序进行一个封装.
function sort_ (list, {sortBy, sortOrder}) {
list.sort((lhs, rhs) => {
let optionNow = lhs[sortBy] || ''
let optionNext = rhs[sortBy] || ''
var intOrString = (s) => {
var n = parseInt(s)
return isNaN(n) ? s : n
}
let lhsArr = optionNow.toString().split(/(\d+)/).map(intOrString)
let rhsArr = optionNext.toString().split(/(\d+)/).map(intOrString)
var isLower = true
for (var i = 0; i < lhsArr.length; i++) {
if (i >= rhsArr.length) {
break
} else if (lhsArr[i] !== rhsArr[i]) {
isLower = lhsArr[i] < rhsArr[i]
break
}
}
if (optionNow !== optionNext) {
if (sortOrder) isLower = !isLower
}
return isLower ? -1 : 1
})
}
其中,list就是你要排序的对象,sortBy表示根据哪个key排序,sortOrder表示正序或者倒序。