JS/TS关于sort函数的多key按优先级嵌套排序

文章介绍了一个用于自定义多键排序的JavaScript函数SortByKeys,该函数接受数据源、排序键和排序顺序参数,能处理多个键的升序或降序排列。同时,文章提供了测试数据和结果,展示了如何根据性别、年龄、班级和身高进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序测试结果

在这里插入图片描述

排序函数

/**
     * 适合各个key自定义升降的情景
     * @param arr 数据源
     * @param keys 排序的key
     * @param isAscend 默认为全升序(1为升序,0为降序
     * @returns  //逆降 顺升
     */
    public static SortByKeys(arr: any[], keys: string[], isAscend?: number[]): void {
        let keyLen = keys.length;
        if (keyLen <= 0) {
            console.error("keys' length is zero.")
            return;
        }
        if (!isAscend) {
            for (let i: number = 0; i < keyLen; i++) {
                isAscend.push(1);
            }
        }
        if (keyLen != isAscend.length) {
            console.error("keys' length != isAscend's length.");
            return;
        }
        arr.sort((a: any, b: any) => {
            for (let idxer: number = 0; idxer < keys.length; idxer++) {
                let key = keys[idxer];
                let aK2V = a[`${key}`];
                let bK2V = b[`${key}`];
                if (aK2V === bK2V) {
                    continue;
                } else {
                    let isAsc = isAscend[idxer];
                    return isAsc ? (aK2V - bK2V) : (bK2V - aK2V);
                }
            }
            return 0;
        });
    }

测试数据

public static test(): void {
        //排序优先级:sex升序 
        //                \ age降序 
        //                      \ class降序 
        //                              \ height升序
        /**数据源 */
        let arr = [
            {
                sex: 1, //1男2女
                age: 18,
                class: 3, //班级
                height: 160,
            },
            {
                sex: 2, //1男2女
                age: 18,
                class: 2, //班级
                height: 160,
            },
            {
                sex: 1, //1男2女
                age: 18,
                class: 3, //班级
                height: 160,
            },
            {
                sex: 2, //1男2女
                age: 20,
                class: 1, //班级
                height: 165,
            },
            {
                sex: 1, //1男2女
                age: 23,
                class: 1, //班级
                height: 166,
            },
            {
                sex: 2, //1男2女
                age: 20,
                class: 2, //班级
                height: 180,
            },
            {
                sex: 2, //1男2女
                age: 20,
                class: 3, //班级
                height: 170,
            },
            {
                sex: 2, //1男2女
                age: 20,
                class: 2, //班级
                height: 170,
            },
            {
                sex: 2, //1男2女
                age: 15,
                class: 2, //班级
                height: 170,
            },
        ];
        console.log("=====================");
        for (let k in arr) {
            console.log(arr[k]);
        }
        console.log("排序后----[升序]---[降序]----[降序]---[升序]----");
        SortUtil.SortByKeys(arr, ['sex', "age", "class", "height"], [1, 0, 0, 1]);
        console.log(arr);
        console.log("=====================");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值