如何根据指定排序对象对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"}], }
实现方案
核心思路
- 修正排序规则:先处理
sectionSorting中的拼写错误(backetst对应backtest),确保规则能匹配目标对象的键 - 排序键数组:提取目标对象的所有键,按照以下逻辑排序:
- 存在排序规则的键,按规则数值从小到大排列
- 无排序规则的键统一放在最后,可按字母顺序或原顺序排列
- 构建排序对象:根据排序后的键数组,重新组装目标对象,保留属性顺序
代码实现
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
相关产品推荐
相关产品推荐

