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
相关产品推荐
相关产品推荐

