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

如何根据指定排序对象对JavaScript对象进行排序?

按自定义排序规则对JavaScript对象排序

需求:根据包含键和排序顺序的对象,对目标JavaScript对象的属性进行排序,无排序规则的属性放在最后。

现有数据

排序规则对象:

const sectionSorting = {
      "metrics": "12",
      "details": "3",
      "portfolio": "5",
      "backetst":"14"
}

待排序对象:

const sections = {
      backtest: [{key: "abc", value: "xyz"}],
      metrics: [{key: "abc", value: "xyz"}],
      details: [{key: "abc", value: "xyz"}],
      methodology: [{key: "abc", value: "xyz"}],
      portfoolio: [{key: "abc", value: "xyz"}]
}

期望输出

const sortedSections = {
   details: [{key: "abc", value: "xyz"}],
   portfoolio: [{key: "abc", value: "xyz"}],
   metrics: [{key: "abc", value: "xyz"}],
   backtest: [{key: "abc", value: "xyz"}],
   methodology: [{key: "abc", value: "xyz"}],
}

实现方案

核心思路

  1. 修正排序规则:先处理sectionSorting中的拼写错误(backetst对应backtest),确保规则能匹配目标对象的键
  2. 排序键数组:提取目标对象的所有键,按照以下逻辑排序:
    • 存在排序规则的键,按规则数值从小到大排列
    • 无排序规则的键统一放在最后,可按字母顺序或原顺序排列
  3. 构建排序对象:根据排序后的键数组,重新组装目标对象,保留属性顺序

代码实现

const sectionSorting = {
      "metrics": "12",
      "details": "3",
      "portfolio": "5",
      "backetst":"14"
};

const sections = {
      backtest: [{key: "abc", value: "xyz"}],
      metrics: [{key: "abc", value: "xyz"}],
      details: [{key: "abc", value: "xyz"}],
      methodology: [{key: "abc", value: "xyz"}],
      portfoolio: [{key: "abc", value: "xyz"}]
};

// 修正排序规则中的拼写错误
const correctedSorting = {...sectionSorting};
if (correctedSorting.backetst) {
  correctedSorting.backtest = correctedSorting.backetst;
  delete correctedSorting.backetst;
}

// 对sections的键进行排序
const sortedKeys = Object.keys(sections).sort((a, b) => {
  const aHasRule = correctedSorting.hasOwnProperty(a);
  const bHasRule = correctedSorting.hasOwnProperty(b);

  if (aHasRule && bHasRule) {
    // 都有排序规则,转数字比较大小
    return Number(correctedSorting[a]) - Number(correctedSorting[b]);
  } else if (aHasRule) {
    // a有规则,b没有,a排前
    return -1;
  } else if (bHasRule) {
    // b有规则,a没有,b排前
    return 1;
  } else {
    // 都无规则,按字母顺序排序,若要保持原顺序可返回0
    return a.localeCompare(b);
  }
});

// 生成排序后的对象
const sortedSections = {};
sortedKeys.forEach(key => {
  sortedSections[key] = sections[key];
});

console.log(sortedSections);

关键说明

  • ES6+ 版本的JavaScript支持对象属性的顺序保留,因此重新构建的对象会严格遵循排序后的键顺序
  • 若不需要修正拼写错误,可直接使用原始的sectionSorting对象
  • 无规则属性的排序逻辑可按需调整,比如保持原顺序只需在else分支返回0即可

内容的提问来源于stack exchange,提问作者Srushti Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:25:16