如何按指定Type规则排序对象数组并将Projected置于末尾?
解决Type排序优先级问题:Actual在前,Projected在后
看起来你的排序逻辑里,type的比较方向搞反了,导致Projected没有被正确放到末尾。咱们来一步步修正:
问题分析
你的order.type里定义了Actual:2、Projected:1,数值越大代表优先级越高,但当前排序用的是order.type[a.type] - order.type[b.type]——这个逻辑会让优先级低的(数值小)元素排在前面,刚好和你想要的Actual优先相反。另外,你还定义了同类型下的quality优先级规则,但当前代码没用到,这也是为什么id3(Actual/Audited)没排在id2(Projected)前面的原因。
解决方案
调整排序逻辑的优先级顺序:
- 优先保证Actual在前,Projected在后:反转
type的比较方向,用order.type[b.type] - order.type[a.type],让高优先级的Actual排在前面。 - 同类型下按quality排序:利用你定义的
order.Actual和order.Projected规则,同样反转比较方向来保证高优先级quality排在前面。 - 最后按model排序:保留你原来的model排序逻辑。
修改后的完整代码
const myData = [{ "id": 1, "businessEntityId": "BE001", "financials": { "Npbt": 2323, "Interest": 123213, "Depreciation": 213123, "Ebit": 1312321, "EbitDa": 123123, "Leasing": 123213 }, "type": "Actual", "startDate": "2018-06-15T00:00:00.000Z", "endDate": "2018-06-15T00:00:00.000Z", "model": "Commercial", "duration": 12, "quality": "Unqualified" }, { "id": 2, "businessEntityId": "BE002", "financials": { "Npbt": 2323, "Interest": 123213, "Depreciation": 213123, "Ebit": 1312321, "EbitDa": 123123, "Leasing": 123213 }, "type": "Projected", "startDate": "2017-06-15T00:00:00.000Z", "endDate": "2017-06-15T00:00:00.000Z", "model": "Commercial", "duration": 12, "quality": "Projection" }, { "id": 3, "businessEntityId": "BE002", "financials": { "Npbt": 2323, "Interest": 123213, "Depreciation": 213123, "Ebit": 1312321, "EbitDa": 123123, "Leasing": 123213 }, "type": "Actual", "startDate": "2017-06-15T00:00:00.000Z", "endDate": "2017-06-15T00:00:00.000Z", "model": "Commercial", "duration": 12, "quality": "Audited" } ] var order = { model: { Commercial: 2, Agribusiness: 1 }, type: { Historical: 3, Actual: 2, Projected: 1, Proforma: 0 }, Actual: { Unqualified: 3, Qualified: 2, Audited: 1 }, Projected: { Projection: 3, Qualified: 2, Audited: 1 }, BOTTOM: Infinity }; let result = myData.sort( (a, b) => { // 1. 优先按type排序:Actual在前,Projected在后 const typeDiff = order.type[b.type] - order.type[a.type]; if (typeDiff !== 0) { return typeDiff; } // 2. 同类型下按quality排序 const qualityDiff = order[a.type][b.quality] - order[a.type][a.quality]; if (qualityDiff !== 0) { return qualityDiff; } // 3. 最后按model排序 return order.model[a.model] - order.model[b.model]; } ); console.log(result.map((obj) => obj.id)) // 输出: [1, 3, 2]
验证结果
运行修改后的代码,控制台会输出[1,3,2],完全符合你的期望:所有Actual类型的项排在前面,Projected类型的项被放到了末尾,同时同类型下也按照你定义的quality优先级完成了排序。
内容的提问来源于stack exchange,提问作者bier hier
相关产品推荐
相关产品推荐

