现象 :
table数据排序时,如果某一对象的值未定义,就会导致排序出现问题。
原因:
'小燕' > undefined // false
'小燕' < undefined // false
'小燕' > null // false
'小燕' < null // false
var arr = [{
id: 1,
user:'小燕',
color:'red'
},
{
id: 2,
color:'green'
},
{
id: 3,
},
{
id: 5,
user:'小燕',
color:'green'
},
{
id: 4,
user:'小伟'
}]
function compare(pro, order = 'asc') {
return (obj1, obj2) => {
let val1 = obj1[pro]
let val2 = obj2[pro]
console.log(val1 < val2, 'val1 < val2')
if (val2 < val1) { // 正序
return 1
} else if (val2 > val1) {
return -1
} else {
return 0
}
}
}
arr.sort(this.compare('user'))
console.log(arr)
修复方法:
// let val1 = typeof(val1) ==='undefined' ? val1 : '';
// let val2 = typeof(val2) ==='undefined' ? val2 : '';
function compare(pro, order = 'asc') {
return (obj1, obj2) => {
let param1 = obj1[pro]
let param2 = obj2[pro]
if (obj1[pro] !== 0) param1 = obj1[pro] || ''
if (obj2[pro] !== 0) param2 = obj2[pro] || ''
// 如果两个参数均为字符串类型
if (typeof param1 === 'string' && typeof param2 === 'string') {
return param1.localeCompare(param2)
}
// 如果参数1为数字,参数2为字符串
if (typeof param1 === 'number' && typeof param2 === 'string') {
return -1
}
// 如果参数1为字符串,参数2为数字
if (typeof param1 === 'string' && typeof param2 === 'number') {
return 1
}
// 如果两个参数均为数字
if (typeof param1 === 'number' && typeof param2 === 'number') {
if (param1 > param2) return 1
if (param1 === param2) return 0
if (param1 < param2) return -1
}
}
}