如何先按DOB排序对象数组,日期相同时按importance从Low到High排序?
实现数组双字段排序:日期优先+自定义优先级排序
首先得提个小细节:你的初始代码里用了a.dueDate.value,但原数组里的日期字段是DOB,得先把这个字段名对应上,不然排序逻辑会失效~
针对你要的「先按DOB排序,同日期下按importance从Low到High排列」的需求,其实可以利用你已经定义的importanceOrder数组来实现优先级的比较,具体思路如下:
核心逻辑
- 日期排序:把字符串格式的DOB转成
Date对象来比较,比直接字符串对比更可靠(避免不同日期格式导致的排序错误); - 优先级排序:当日期相同时,通过
importanceOrder数组获取每个importance对应的索引值——索引越小,优先级越高(因为你要Low在前),然后比较两个索引的差值即可。
完整实现代码
先修正你初始代码里的小问题,再补全else块的逻辑:
// 注意:原数组里的importance有'Medium',所以把你初始代码里的'Normal'改成'Medium' const importanceOrder = ['Low', 'Medium', 'High']; const arr = [ { name : 'Gary', DOB : '01/01/1980', importance: 'High' }, { name : 'Bill', DOB : '01/01/1985', importance: 'High' }, { name : 'Joe', DOB : '01/01/1981', importance: 'Medium' }, { name : 'Phillip', DOB : '01/01/1981', importance: 'High' }, { name : 'Ed', DOB : '01/01/1980', importance: 'Low' }, { name : 'Nix', DOB : '01/01/1980', importance: 'High' }, { name : 'Pat', DOB : '01/01/1980', importance: 'Low' } ]; arr.sort(function(a, b) { // 将日期字符串转为Date对象,确保比较准确 const dateA = new Date(a.DOB); const dateB = new Date(b.DOB); // 先比较日期 if (dateA.getTime() !== dateB.getTime()) { // Date对象直接相减会返回时间戳差值,负数表示dateA更早,排在前面 return dateA - dateB; } else { // 日期相同时,比较importance的优先级 const rankA = importanceOrder.indexOf(a.importance); const rankB = importanceOrder.indexOf(b.importance); // 索引小的优先级高,所以返回差值实现升序排列(Low→Medium→High) return rankA - rankB; } });
性能优化建议
如果你的数组很大,indexOf每次都会遍历importanceOrder数组,效率会稍低。可以把优先级映射成一个对象,用键值对的方式直接获取排名,查找效率是O(1):
const importanceRank = { 'Low': 0, 'Medium': 1, 'High': 2 }; arr.sort(function(a, b) { const dateA = new Date(a.DOB); const dateB = new Date(b.DOB); if (dateA.getTime() !== dateB.getTime()) { return dateA - dateB; } else { return importanceRank[a.importance] - importanceRank[b.importance]; } });
验证排序结果
运行代码后,DOB为01/01/1980的条目会按Ed(Low)→Pat(Low)→Gary(High)→Nix(High)的顺序排列,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Daft
相关产品推荐
相关产品推荐

