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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:39:05