js、javascript 数组排序 多层排序 支持升序和降序 优先排序

153 阅读1分钟

例子

let arr = [
	{
		vo: "5",
		phase: "B",
		age: 15
	},
	{
		vo: "5",
		phase: "C",
		age: 15
	}, {
		vo: "5",
		phase: "A"
	},
	{
		vo: "15",
		phase: "B"
	},
	{
		vo: "25",
		phase: "B"
	},

	{
		vo: "5",
		phase: "C",
		age: 10
	},
	{
		vo: "25",
		phase: "A"
	}
];

核心代码实现

/**
 * @method arraySort
 * @param {array} arr 需要排序的数组
 * @@param {string}  ...args 排序的key  支持多个key  优先级一级比一级低 ,多个key用逗号隔开
 * @@return {Object}
 * */
function arraySort(arr,...args){
    function sortRule(a,b,key){
        if(isNaN(a[key]) && isNaN(b[key])){
            if(!a[key] || !b[key]) return 0;
            if(a[key] < b[key]){
                return -1
            }else if(a[key] > b[key]){
                return 1
            }else{
                return 0
            }
        }else{
            return a[key] - b[key];
        }
    }
    // 内部核心排序函数
    function _arraySort(type){
        let newArr = [];
        args.forEach((key,key_index)=>{
            newArr = arr.sort(function(a,b){
                let isGo = true
                if(key_index>0){
                    args.forEach((k,i) => {
                        if(i>=key_index) return
                        isGo = a[k] === b[k]
                    })
                }
                if(isGo){
                    if(type=='asce'){
                        return sortRule(a,b,key)
                    }else{
                        return sortRule(b,a,key)
                    }
                }else{
                    return 0;
                }
            })
        })
        return newArr;
    }

    /**
     * @method 降序
     * @return {array} 返回新数组
     * */
    function desc(){
        return _arraySort('desc');
    }
    /**
     * @method 升序
     * @return {array} 返回新数组
     * */
    function asce(){
        return _arraySort('asce');
    }
    return {
        desc,
        asce
    }
}

示范

// 支持升序和降序
const newArr = arraySort(arr,'vo','phase','age').asce()
console.log(newArr,123);