为了账号安全,请及时绑定邮箱和手机立即绑定

sort函数如何在JavaScript中工作,以及compare函数

sort函数如何在JavaScript中工作,以及compare函数

茅侃侃 2019-08-01 15:10:14
sort函数如何在JavaScript中工作,以及compare函数正如已经问过的那样:排序功能如何在JavaScript中运行,以及compare功能?如果我有一个数组,我array.sort(compare)现在在书中写道,如果compare函数返回a-b(数组的两个索引),那么它的工作原理是结果是否大于0,小于0或等于但是,它究竟是如何运作的?我无法解决这个问题。
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

“compare”函数必须带两个参数,通常称为a和b。然后根据这些值a和b使比较函数返回0,大于0或小于0 。


如果a大于b,则返回大于0

如果a等于b,则返回0

如果a小于b,则返回小于0

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


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


让我们来看一个简单的例子......假设你只是对一些数字进行排序,所以我们有一个非常简单的比较函数:


function compare(a,b) {

    return a - b;

}

如果a大于b则简单地从a中减去b将总是返回大于0,如果它们相等则返回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大于或小于5?不到,所以把这两个数字放在我们的清单中:1,5

3.14大于或小于1?大于,所以它在新列表中追逐1

在我们的新清单中3.14是大于还是小于5?不到,所以它在5之前。我们的新名单现在是[1,3.14,5]

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


查看完整回答
反对 回复 2019-08-01
?
阿晨1998

TA贡献2037条经验 获得超6个赞

默认情况下,数组sort()方法按字母顺序按升序排序。如果你想以其他顺序排序,因为你的数组包含数字或对象,那么你可以将函数传递给sort()

您传入的函数有两个参数,通常称为a和b,并返回:如果第一个参数应在第二个参数之前排序,则返回负数(如果参数相等,则返回<b)0(a == b)为正数如果第一个参数应该在第二个之后排序(a> b)

现在,这是关键位:作为参数传递的函数sort()将在sort()处理整个数组时被重复调用。sort()不知道或不关心数组中事物的数据类型:每次需要知道“项目A是否在项目B之前?” 它只是调用你的功能。你不需要担心内部使用什么类型的排序算法sort(),实际上一个浏览器可能会使用不同的算法到另一个浏览器,但这没关系,因为你必须提供一种方法来比较你的数组中的任何两个项目。

你的函数可以有一个if / else if / else结构来决定返回什么结果,但对于数字,简单地返回(ab)将为你实现这一点,因为减法的结果将是-ve,0或+ ve并正确地按升序排列数字。返回(ba)会让他们下降:

  var sortedArray = myArray.sort(function(a,b){
                                    return (a-b);
                                });

如果你有一个对象数组,并希望对对象的某些特定属性或属性进行排序,那么你也可以这样做。例如,假设这种格式的对象:

{ id : 1,
  name : "Fred",
  address : "12 Smith St",
  phone : "0262626262" }

然后你可以通过'id'属性对这些对象的数组进行排序,如下所示:

var sortedArray = myArray.sort(function(a,b){
                                  return (a.id - b.id);
                              });

或者您可以通过“名称”属性(按字母顺序)对这些对象的数组进行排序,如下所示:

var sortedArray = myArray.sort(function(a,b){
                                   if (a.name < b.name)
                                      return -1;
                                   else if (a.name == b.name)
                                      return 0;
                                   else
                                      return 1;
                               });

请注意,在我的最后一个例子中,我已经if / else if / else提到了我之前提到的完整结构。

对于使用多个属性对对象进行排序的示例,您可以进一步扩展以包括辅助排序,即(在我的示例中)如果名称属性相等,则可以返回比较电话属性。


查看完整回答
反对 回复 2019-08-01
?
侃侃无极

TA贡献2051条经验 获得超10个赞

此方法使用Array.sort(compareFunction和sortOptions)顺序的语法和参数,其参数定义如下:

compareFunction - 用于确定数组元素排序顺序的比较函数。此参数是可选的。比较函数应该用于比较两个参数。给定元素的A和B,compareFunction的结果可以是负值,0或正值:

如果返回值为负,则表示A在排序序列中出现在B之前。如果返回值为0,则A和B具有相同的排序顺序。如果返回值为正,则表示A在排序序列中出现在B之后。


查看完整回答
反对 回复 2019-08-01
  • 3 回答
  • 0 关注
  • 467 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信