大佬教程收集整理的这篇文章主要介绍了如何让排序函数调用比较函数,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
尝试编写一些干净的 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 函数不会改变行为,因为它不依赖于成员变量。
以上是大佬教程为你收集整理的如何让排序函数调用比较函数全部内容,希望文章能够帮你解决如何让排序函数调用比较函数所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。