问题:
如果数组内某一对象为空值,排序是怎样的呢?(显然并不是按年龄顺序排序的,因为存在null和undefined)
var arr=[{"age":24,name:'zs'},{"age":0,name:'ls'},{"age":0,name:'gr'},
{"age":null,name:'yo'},{"age":7,name:'pl'},{"age":undefined,name:'tt'},
{"age":null,name:'jz'},{"age":0,name:'mn'},{"age":undefined,name:'we'}]
//[{"age": 0,"name": "ls"},{"age": 0,"name": "gr"},{"age": null,"name": "yo"},
//{"age": null,"name": "jz"},{"age": 0,"name": "mn"},{"age": 7,"name": "pl"},
//{"age": 24,"name": "zs"},{"age":undefined,"name": "tt"},
//{"age":undefined,"name": "we"}]
console.log(arr.sort(compare("age")));
解决方法:
sort 方法提供的排序方法中,如果返回的数字是 0 那么会保持原顺序,如果返回的数字 >0 那么会将 a 至于 b 之后,如果返回的数字 < 0 那么会将 a 至于 b 之前。
如果遇到字段可能是 undefined,那么我们需要特殊判断处理下。
首先判断如果 a,b 的排序字段都是 undefined 返回 0 保持原顺序。
再判断如果 a 的字段是 undefined 但 b 的排序字段存在则返回 >0 将 a 至于 b 之后。
再判断 b 的排序字段如果是 undefined 但 a 的排序字段存在则返回 <0 将 a 至于 b 之前。
最后 a,b 的排序字段都存在时,使用 a,b 的排序字段计算后的返回结果判断顺序
const compare = function (orderType, props) {
return function (obj1, obj2) {
var val1 = obj1[props];
var val2 = obj2[props];
if (val1 == null && val2 == null) {
return 0;
}
if(val1 == null){
return 999;
}
if(val2 == null){
return -999
}
if (typeof val1 === 'string' && typeof val2 === 'string') {
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
}
return 0;
}
return orderType === 'ascend' ? val1 - val2 : val2 - val1;
}
}
const orderType = 'descend'; // descend
const rr = prodInfo.sort(compare(orderType, 'num'))
console.log(rr.map(item => item.num))
参考链接1:https://www.cnblogs.com/gby-web/p/16743564.html
参考链接2:https://juejin.cn/post/7165121725678665765/