JS对象数组多属性排序时处理null到期日并保障名称排序的方法
问题原因
你当前的排序逻辑问题出在sortByDueDate函数的边界判断上:当待比较的两个元素due都为null时,现有逻辑会直接返回非0值,不会触发后续的名称排序逻辑,导致null分组内的元素没有按名称排序。
解决方案
仅需要调整sortByDueDate的边界判断逻辑,优先处理两个元素due都为null的场景,返回0触发后续名称排序即可,全程仅需一次数组遍历:
const sortByName = (a, b) => { const lc = x => x.name.toLowerCase(); return lc(a).localeCompare(lc(b)); } const sortByDueDate = (a, b) => { // 两个元素都是null,返回0触发后续名称排序 if (a.due === null && b.due === null) return 0 // 仅a是null,a排在后面 if (a.due === null) return 1 // 仅b是null,b排在后面 if (b.due === null) return -1 // 都有有效日期,按时间戳升序排序 return a.due.getTime() - b.due.getTime() } const items = [ {name: 'AItem', due: new Date(2021, 8, 26)}, {name: 'WItem', due: null}, {name: 'TItem', due: new Date(2021, 7, 26)}, {name: 'CItem', due: new Date(2021, 7, 26)}, {name: 'ZItem', due: null}, {name: 'OItem', due: new Date(2021, 1, 11)}, ]; console.log(items.sort((a,b) => sortByDueDate(a,b) || sortByName(a,b)));
运行结果
[ { name: 'OItem', due: 2021-02-10T23:00:00.000Z }, { name: 'CItem', due: 2021-08-25T22:00:00.000Z }, { name: 'TItem', due: 2021-08-25T22:00:00.000Z }, { name: 'AItem', due: 2021-09-25T22:00:00.000Z }, { name: 'WItem', due: null }, { name: 'ZItem', due: null } ]
内容的提问来源于stack exchange,提问作者Juozas Miškinis
相关产品推荐
相关产品推荐

