当前位置: 首页 > 知识库问答 >
问题:

如何让排序函数调用比较函数

翟新
2023-03-14

尝试编写一些干净的JS排序函数。下面是我的模板中一个按钮的click处理程序,它调用各个方法按不同的属性排序。

(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语句放入它们自己的函数中,以便更好地编写干巴巴的代码。所以我尝试了下面的方法,但是compareFunction甚至从来没有调用过GET。我做错了什么?

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)

共有1个答案

沈骞仕
2023-03-14

很可能使用this在被定义为普通JS函数的回调中遇到了作用域问题。

尝试将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函数不会改变行为,因为它不依赖于成员变量。

 类似资料:
  • 所以我正在使用一些预先存在的比较器,它们比较两个元组中的某些值,如果第一个大于第二个,则返回true,否则返回false。这是其中之一的代码: 现在,我有一个字典,里面有许多上面比较的类型的元组条目。我想以相反的顺序对它们进行排序,但我真的不知道如何完成。我在想这样的事情: 但是我不知道向比较器传递什么,因为每个比较器都有两个参数(subInfo1、subInfo2)。我不能更改比较器函数。

  • 问题内容: 这怎么不出现属性错误?函数对象没有任何比较方法。它以某种方式使用id()吗? 我知道它比较地址,但是如何?拦截__lt , eq__等是一些低级黑客吗? 问题答案: 函数对象没有定义自己的比较或丰富的比较。相反,它们从类型对象继承,这些类型对象根据内存中的对象地址实现丰富的比较。 因此,是的,它像内置的id()函数一样有效地使用地址。 在Python 3中,功能不再可排序。

  • 我发布这个问题是因为我在尝试从oracle函数中使用dbms\U比较oracle包时遇到了一些错误。 我创建了一个函数,该函数应该返回执行的比较的scanID,以便能够从Java中检索scanID的值。但是,该函数没有成功执行,因为它引发了一些错误。dbms\u比较被识别为标识符,因此引发以下错误:PLS-00201:必须声明标识符“dbms\u比较”。 请在下面找到我创建的Oracle函数。任何

  • 我想学习java中的比较器,我在网上找到了这个很好的例子,我的问题是如何更改这个代码,使宠物的名字按年龄和降序排列,以便最大的是第一个,最小的是最后一个?

  • 问题内容: 如何比较javascript中的2个函数?我不是在谈论内部参考。说 可以比较和吗? 问题答案:

  • 比较函数是一个函数,它接受两个参数a和b,并返回一个描述其顺序的整数。如果a小于b,则结果为负整数。如果a大于b,则结果为某个正整数。否则,a和b相等,结果为零。 此函数通常用于参数化来自标准库的排序和搜索算法。 实现字符的比较功能相当容易;只需减去参数: 这是因为通常假设两个字符之间的差适合一个整数。(注意,此假设不适用于的系统) 这种技巧无法用于比较整数,因为两个整数之间的差通常不适合一个整数