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
相关产品推荐
相关产品推荐

