基于另一数组对Applications数组进行多条件排序的需求
问题描述
现有两个数组Applications和ApplicationOrder,需根据ApplicationOrder中的Order值对Applications数组排序;当Order值重复时,再按Applications的Title字段排序,ID为两个数组的共同关联字段。
原始数据
const Applications = [ { "ID": 30, "Title": "Balance", "Acronym": null, "Link": { "$2_1": "https:abc.com", "$1_1": "https:abc.com" } }, { "ID": 12, "Title": "Scorecard", "Acronym": null, "Link": { "$2_1": "https:xyz.com", "$1_1": "https:xyz.com" } }, { "ID": 62, "Title": "Best Practices", "Acronym": null, "Link": { "$2_1": "https:xyz.com", "$1_1": "https:xyz.com" } }, { "ID": 15, "Title": "User Actions", "Acronym": null, "Link": { "$2_1": "https:xyz.com", "$1_1": "https:xyz.com" } } ]; const ApplicationOrder = [ {"Id":"30","Order":"4"}, {"Id":"12","Order":"4"}, {"Id":"62","Order":"2"}, {"Id":"15","Order":"1"} ];
排序规则
- 优先按
Order值从小到大排序 - 当
Order值相同时,按Title字段的字典序从小到大排序
期望输出
const sortedApplications = [ { "ID": 15, "Title": "User Actions", "Acronym": null, "Link": { "$2_1": "https:xyz.com", "$1_1": "https:xyz.com" } }, { "ID": 62, "Title": "Best Practices", "Acronym": null, "Link": { "$2_1": "https:xyz.com", "$1_1": "https:xyz.com" } }, { "ID": 30, "Title": "Balance", "Acronym": null, "Link": { "$2_1": "https:abc.com", "$1_1": "https:abc.com" } }, { "ID": 12, "Title": "Scorecard", "Acronym": null, "Link": { "$2_1": "https:xyz.com", "$1_1": "https:xyz.com" } } ];
解决方案
通过以下步骤实现需求:
- 将
ApplicationOrder转换为ID与Order的映射表,提升排序时的查找效率 - 使用数组
sort()方法,先按Order数值排序,Order相同时按Title字典序排序
代码实现
// 构建ID到Order的映射,字符串ID转数字后存储,避免类型不匹配 const orderMap = new Map(); ApplicationOrder.forEach(item => { orderMap.set(Number(item.Id), parseInt(item.Order, 10)); }); // 排序原数组(创建副本避免修改原数据) const sortedApplications = [...Applications].sort((appA, appB) => { const orderA = orderMap.get(appA.ID); const orderB = orderMap.get(appB.ID); // 优先按Order从小到大排序 if (orderA !== orderB) { return orderA - orderB; } // Order相同时,按Title字典序排序 return appA.Title.localeCompare(appB.Title); }); console.log(sortedApplications);
代码说明
- 用
Map存储ID与Order的对应关系,单次遍历构建映射,后续查找Order的时间复杂度为O(1) - 用
[...Applications]创建原数组副本,避免排序操作修改原数组 - 使用
localeCompare()处理字符串排序,支持多语言场景,比直接用字符串比较运算符更可靠 - 将Order字符串转为整数后比较,避免字符串排序的异常(比如"10"会错误排在"2"前面)
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

