当前位置: 首页 > 面试题库 >

排序功能以及比较功能如何在JavaScript中起作用

南宫兴德
2023-03-14
问题内容

正如已经问过的:sort函数与compare函数一起在JavaScript中如何工作?如果我有一个数组,array.sort(compare)现在我在书中写道,如果compare函数返回a-b(数组的两个索引),则它基于结果是否大于0,小于0或等于的事实工作0.但是,它到底如何工作?我无法解决。


问题答案:

“比较”功能必须采用两个参数,通常称为 ab 。然后,根据这些值 ab 使比较函数返回0,大于0或小于0 。

  1. 如果 a* 大于 b, 则返回大于0 *
  2. 如果 a* 等于 b, 则返回0 *
  3. 如果 a* 小于 b, 则返回小于0 *

使用这三个返回值和仅两个参数,可以编写一个可以对任何类型的输入数据类型或复杂数据结构进行排序的比较函数。

然后,当您使用自定义比较函数调用sort()时,将在要排序的列表中的对上调用比较函数,以确定适当的顺序。

让我们来看一个简单的示例…假设您只是对一些数字进行排序,因此我们有一个非常简单的比较函数:

function compare(a,b) {
    return a - b;
}

如果a大于b,简单地从a中减去b总是返回大于零,如果相等则返回0,如果a小于b则返回小于零。因此,它满足比较功能的要求。

现在,假设这是我们要排序的数字列表:

var numbers = [1,5,3.14];

当您调用时numbers.sort(compare),它将在内部实际执行:

compare(1,5);     // Returns -4, a is less than b
compare(1,3.14);  // Return -2.14, a is less than b
compare(5,3.14);  // returns 1.86, a is greater than b

如果您曾经进行过手动排序或按字母顺序排列,那么您所做的正是同一件事,可能没有意识到。即使您可能要比较数十个或几百个项目,您一次也经常只比较两个数字(或作者的姓氏,或其他)。再次浏览或简短列出三个数字,您将从比较前两个数字开始:

  1. 1是否大于或小于5?小于,因此将这两个数字放在我们的列表中:1,5
  2. 3.14是否大于或小于1?大于,因此在新列表中排在1之后
  3. 在我们的新列表中,3.14是否大于或小于5?小于,因此在5之前。我们的新列表现在为[1,3.14,5]

因为您可以提供自己的compare()函数,所以可以对任意复杂的数据进行排序,而不仅仅是数字。



 类似资料:
  • 问题内容: 例如,我有要比较的功能列表: http://play.golang.org/p/_rCys6rynf 如果两个函数相同,比较的正确方法是什么? 问题答案: 在继续之前:您应该重构而不是比较函数值地址。 规格:比较运算符: 切片,贴图和函数值不可比较。但是,在特殊情况下,可以将切片,映射或函数值与预先声明的标识符进行比较。 函数值不可比。如果功能值的地址相同(不是保存功能值的变量的地址,

  • 问题内容: 我使用atocomplete.jquery插件来建议输入文本,结果得到了这个数组: 当我开始搜索从子字符串开始的东西时,它显示出数组排序如下: 我需要这样的东西: 有任何想法吗? 问题答案: 该插件可能区分大小写。尝试输入而不是。您可能将结果设置为不区分大小写。这个问题可能会有所帮助。 对于上的自定义排序函数,您可以使用任何JavaScript函数并将其作为参数传递给的方法,如下所示:

  • 问题内容: 在 Python 2.x中 ,我可以将自定义函数传递给sort和.sort函数 因为在 我的 语言中,辅音是与此顺序一起出现的 但是在 Python 3.x中 ,看起来我无法传递关键字 有其他选择吗?或者我也应该编写自己的排序函数吗? 注意:我通过使用“ k”,“ kh”等进行了简化。实际字符是Unicode,甚至更复杂,有时在辅音前后都有元音,所以我完成了自定义比较功能,因此这一部分

  • 问题内容: 对于Comparator类中的比较源代码 我明白之间的差别和。我不明白的是,为什么这种方法有他们。有人可以给我一个关于参数看起来像这样无法实现的示例吗? 例如 : 也可以使用以下函数定义进行编译 问题答案: 这是一个简单的示例:按重量比较汽车。我将首先以文本形式描述问题,然后以各种可能的方式演示如果省略或则将如何出错。我还将展示在每种情况下都可用的丑陋的部分解决方法。 如果您喜欢代码而

  • 问题内容: 我正在尝试自己学习Socket。我对Oracle网站上的文字感到有些困惑。我对此有一些疑问。在此先感谢您的明确解释。 setSoTimeout 公共无效setSoTimeout(int超时)引发SocketException 以指定的超时时间启用/禁用SO_TIMEOUT,以毫秒为单位。将此选项设置为非零超时后,与此套接字关联的调用将仅在此时间量内阻塞。如果超时到期,则尽管Socket

  • redis支持对list,set和sorted set元素的排序。排序命令是sort 完整的命令格式如下: SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey] 复杂度为O(N+M*log(M))。(N是集合大小,M 为返回元素的数量) 说明: [ASC|DESC] [AL