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

如何按指定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)前面的原因。

解决方案

调整排序逻辑的优先级顺序:

  1. 优先保证Actual在前,Projected在后:反转type的比较方向,用order.type[b.type] - order.type[a.type],让高优先级的Actual排在前面。
  2. 同类型下按quality排序:利用你定义的order.Actual和order.Projected规则,同样反转比较方向来保证高优先级quality排在前面。
  3. 最后按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:54:09