如何解决如何让排序函数调用比较函数
尝试编写一些干净的 JS 排序函数。下面是我模板中按钮上的点击处理程序,它调用各个方法以按不同的属性进行排序。
(click)="addresses.sort(sortByTown)"
它调用下面的方法。效果很好,很不错!
sortByTown(address1: any,address2: any): number {
const a = address1.town.toUpperCase();
const b = address2.town.toUpperCase();
if (a > b) {
return 1;
} else if (a < b) {
return -1;
}
return 0;
}
我遇到的问题是,我有大约 4 个这样的排序方法,我想将 if 语句放入它们自己的函数中,以便更好地编写 DRY 代码。所以我尝试了下面的方法,但 compareFunction 甚至从未被调用。我做错了什么?
sortByTown(address1: any,address2: any): number {
const a = address1.town.toUpperCase();
const b = address2.town.toUpperCase();
return this.compareAddresses(a,b);
}
compareAddresses(a: string | number,b: string | number): number {
if (a > b) {
return 1;
} else if (a < b) {
return -1;
}
return 0;
}
TypeError: Cannot read property 'compareAddresses' of undefined
at sortByStreetName (address.component.ts:43)
at Array.sort (<anonymous>)
at AddressComponent_Template_button_click_9_listener (address.component.html:10)
at executeListenerWithErrorHandling (core.js:15182)
at wrapListenerIn_markDirtyAndPreventDefault (core.js:15217)
at HTMLButtonElement.<anonymous> (platform-browser.js:582)
at ZoneDelegate.invokeTask (zone-evergreen.js:406)
at Object.onInvokeTask (core.js:28500)
at ZoneDelegate.invokeTask (zone-evergreen.js:405)
at Zone.runTask (zone-evergreen.js:178)
解决方法
很可能在定义为普通 JS 函数的回调中使用 this
会遇到范围问题。
尝试将 sortByTown()
定义为箭头函数。
sortByTown = (address1: any,address2: any): number => {
const a = address1.town.toUpperCase();
const b = address2.town.toUpperCase();
return this.compareAddresses(a,b);
}
更新:正如@yurzui 在评论中指出的那样,将 compareAddresses()
定义为普通的 JS 函数不会改变行为,因为它不依赖于成员变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。