js实现集合根据某个字段排序功能
// 中文字符串排序,包括空格、数字、英文类的字符串
export function sortDevName(str1, str2) {
let res = 0
for (let i = 0; ;i++) {
if (!str1[i] || !str2[i]) {
res = str1.length - str2.length
break
}
const char1 = str1[i]
const char1Type = getChartType(char1)
const char2 = str2[i]
const char2Type = getChartType(char2)
// 类型相同的逐个比较字符
if (char1Type[0] === char2Type[0]) {
if (char1 === char2) {
continue
} else {
if (char1Type[0] === 'zh') {
res = char1.localeCompare(char2)
} else if (char1Type[0] === 'en') {
res = char1.charCodeAt(0) - char2.charCodeAt(0)
} else {
res = char1 - char2
}
break
}
} else {
// 类型不同的,直接用返回的数字相减
res = char1Type[1] - char2Type[1]
break
}
}
return res
}
export function getChartType(char) {
// 数字可按照排序的要求进行自定义,我这边产品的要求是
// 数字(0->9)->大写字母(A->Z)->小写字母(a->z)->中文拼音(a->z)
if (/^[\u4e00-\u9fa5]$/.test(char)) {
return ['zh', 300]
}
if (/^[a-zA-Z]$/.test(char)) {
return ['en', 200]
}
if (/^[0-9]$/.test(char)) {
return ['number', 100]
}
return ['others', 999]
}
/**
* 降序
*/
export function desc(property) {
switch (property) {
case 'date类型':
return function(a, b) {
return Date.parse(b[property]) - Date.parse(a[property])
}
case '数字类型':
return function(a, b) { return b[property] - a[property] }
default: //字符串
return function(a, b) { return sortDevName(b[property], a[property]) }
}
}
/**
* 升序
*/
export function asc(property) {
switch (property) {
case 'date类型':
return function(a, b) {
return Date.parse(a[property]) - Date.parse(b[property])
}
case '数字类型':
return function(a, b) { return a[property] - b[property] }
default: //字符串
return function(a, b) { return sortDevName(a[property], b[property]) }
}
}
// 引用实现
data.sort(asc('name'))
data.sort(desc('name'))
做的不好,仅供参考。