JavaScript排序sort()方法(解决null、undefined、0之间的排序(混乱)问题)

JavaScript排序sort()方法(解决null、undefined、0之间的排序(混乱)问题)_第1张图片
JavaScript排序sort()方法(解决null、undefined、0之间的排序(混乱)问题)_第2张图片

问题:

如果数组内某一对象为空值,排序是怎样的呢?(显然并不是按年龄顺序排序的,因为存在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/

你可能感兴趣的:(javascript,开发语言,ecmascript)