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

JavaScript实现Task按到期时间冒泡排序出现TypeError问题咨询

错误根因

你的sortByWhenDue方法中使用的冒泡排序逻辑存在数组越界问题:
当循环变量i等于this._tasks.length - 1(也就是数组最后一个元素的下标)时,this._tasks[i+1]是不存在的,值为undefined,尝试读取undefined的_whenDue属性就会触发你遇到的报错。

解决方法

方案1:修改现有冒泡排序的边界条件

只需要把for循环的判断条件从i < this._tasks.length改为i < this._tasks.length - 1即可,修改后的方法代码如下:

sortByWhenDue() {
    do { 
        let swapped = false;
        for (let i = 0; i < this._tasks.length - 1; i++) {
            if (this._tasks[i]._whenDue > this._tasks[i+1]._whenDue) {
                let temp = this._tasks[i+1];
                this._tasks[i+1] = this._tasks[i];
                this._tasks[i] = temp;
                swapped = true;
            }
        }
    } while (swapped);
}

方案2:使用JS内置的数组排序方法(更简洁高效)

JS原生的Array.prototype.sort方法性能远高于手动实现的冒泡排序,代码也更短,同时建议调用Task类已定义的whenDue getter访问属性,不要直接操作私有属性,写法如下:

sortByWhenDue() {
    this._tasks.sort((taskA, taskB) => taskA.whenDue - taskB.whenDue);
}

Date对象相减会自动转换为毫秒时间戳计算,返回负值就会把taskA排在taskB前面,正好满足你要的从早到晚排序的需求。

内容的提问来源于stack exchange,提问作者kene02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:54:04