You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS中如何将特定状态元素移至排序后数组底部并保持排序

问题:对象数组多规则排序需求

我有一个对象数组,希望按特定字段(如price)进行排序。数组中的对象包含status字段,取值可为Available、Reserved或Occupied。目前使用的sortList函数能正常实现按price降序排序,但我需要补充以下规则:

  • 排序后将status不为Available的元素移至数组底部
  • Reserved类型元素要排在Occupied类型之前
  • 同一status分组内的元素,仍保持按price降序排序的规则

初始数组

[{
    id: 1619,
    address: "Street 1",
    rooms: 3,
    price: 10695, 
    status: "Available",
},
{
    id: 1620,
    address: "Street 5",
    rooms: 3,
    price: 7859, 
    status: "Available",
},
{
    id: 1626,
    address: "Street 7",
    rooms: 3,
    price: 8595, 
    status: "Reserved",
},
{
    id: 1624,
    address: "Street 11",
    rooms: 4,
    price: 9795, 
    status: "Occupied",
},
{
    id: 1624,
    address: "Street 3",
    rooms: 4,
    price: 2856, 
    status: "Reserved",
}]

现有排序函数

function sortList(property, list, order) {
        list.sort(function (a, b) {
            if (a[property] === b[property]) {
                return 0;
            }
            const va = a[property];
            const vb = b[property];

            if (order === 'asc') {
                return va < vb ? 1 : -1;
            }
            return va > vb ? 1 : -1;
        });
    }

sortList("price", list, "desc");

期望最终数组结构

[{
    id: 1619,
    address: "Street 1",
    rooms: 3,
    price: 10695, 
    status: "Available",
},
{
    id: 1620,
    address: "Street 5",
    rooms: 3,
    price: 7859, 
    status: "Available",
},
{
    id: 1626,
    address: "Street 7",
    rooms: 3,
    price: 8595, 
    status: "Reserved",
},
{
    id: 1624,
    address: "Street 3",
    rooms: 4,
    price: 2856, 
    status: "Reserved",
},
{
    id: 1624,
    address: "Street 11",
    rooms: 4,
    price: 9795, 
    status: "Occupied",
}]

解决方案

我们可以在原排序逻辑中加入status优先级的判断,给不同状态定义权重值:

  • Available权重为0(优先级最高)
  • Reserved权重为1(次之)
  • Occupied权重为2(优先级最低)

排序时先比较两个元素的status权重,权重小的排前面;如果权重相同,再按原有的price排序规则处理。修改后的函数如下:

function sortList(property, list, order) {
    // 定义status的优先级权重
    const statusWeight = {
        "Available": 0,
        "Reserved": 1,
        "Occupied": 2
    };

    list.sort(function (a, b) {
        // 先比较status权重
        const statusDiff = statusWeight[a.status] - statusWeight[b.status];
        if (statusDiff !== 0) {
            return statusDiff;
        }

        // status相同时,按原有的price排序规则处理
        const va = a[property];
        const vb = b[property];
        if (va === vb) {
            return 0;
        }
        if (order === 'asc') {
            return va < vb ? 1 : -1;
        }
        return va > vb ? 1 : -1;
    });
}

sortList("price", list, "desc");

运行这个函数后,数组会先按status分组排序,同一分组内的元素保持price降序排列,完全符合需求。

内容的提问来源于stack exchange,提问作者Morten Hagh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:25:18