为什么points.sort(function(a,b){return a-b});返回-1,0或1?

时间:2014-07-15 21:28:03

标签: javascript

我的困难可能是我的数学文盲,但我试图在JavaScript数组中对某些数字进行排序,这是我在网上找到的解决方案。它确实有效,但我的问题是为什么?!我真的很想理解这段代码。

该网站,W3学校说:

您可以通过提供返回-1,0或1的函数来解决此问题:

var points = [40, 100, 1, 5, 25, 10];

points.sort(function(a,b){return a-b});

为什么只返回-1,0或1?我有谷歌搜索,返回可以返回你想要的任何值。

同样,如果这是一个令人难以置信的愚蠢问题,我道歉。

6 个答案:

答案 0 :(得分:12)

排序回调必须返回

  • 如果a < b
  • ,则为负数
  • 0 if a === b
  • 如果a > b
  • ,则为正数

需要三个可能的返回值,因为排序函数现在需要a小于,等于或大于b才能在结果中正确定位a阵列。

如果您使用非数字数据(我想这就是W3Schools提到它的原因),那么返回-101是很常见的。但是如果你使用数值数据,你可以简单地减去这些值,因为

  • 如果a < ba - b < 0,即负数
  • 如果a === ba - b === 0,即0
  • 如果a > ba - b > 0,即正数

W3Schools不是很精确,这也是你应该避免它的原因之一。请改用MDN

答案 1 :(得分:5)

它不一定是-1,0,1,任何负数或正数will do the trick

但它是如何运作的? sort()方法需要知道每两个元素之间的关系,以便对它们进行排序。对于每对(根据所使用的算法),它根据返回值调用函数,可以交换它们。请注意,a-b如果b>a则返回负值,而a>b则返回正值。这导致升序。

只是为了测试,将a-b替换为b-a,您将获得降序。您甚至可能会使它更复杂,根据(例如)最不重要的数字对它们进行排序:

a.sort(function() {return (a%10) - (b%10);}

答案 2 :(得分:2)

如果Function(a, b)小于0,则将a排序为低于b的索引,即a首先出现。

如果Function(a, b)返回0,则ab相对于彼此保持不变,但相对于所有不同的元素进行排序。

  

注意:ECMAscript标准不保证这种行为,并且   因此并非所有浏览器(例如Mozilla版本至少可以追溯到   2003)尊重这一点。

如果Function(a, b)大于0,请将b排序为低于a的索引,即b首先出现。  当给定一对特定元素Function(a, b)a作为其两个参数时,b必须始终返回相同的值。如果返回的结果不一致,则排序顺序为undefined

答案 3 :(得分:1)

请参阅规范http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.14

不要依赖学校必须说的话。

  

如果comparefn未定义,则它应该是一个接受的函数   两个参数x和y如果x&lt;则返回负值。 y,如果为x则为零   = y,如果x>,则为正值;收率

答案 4 :(得分:1)

引自ECMA Script Reference

  

Array.prototype.sort(comparefn)

     

此数组的元素已排序。排序不一定   稳定(即,比较相等的元素不一定保留   按原来的顺序)。如果comparefn未定义,则应该是   一个接受两个参数x和y并返回负数的函数   如果x&lt; y,如果x = y则为零,或者如果x> y则为正值;收率

其余的是解释器之间可能不同的实现细节。

答案 5 :(得分:0)

我正在尝试回答您“确实有效,但是为什么?”

这是javascript中sort方法的语法。请注意,compareFunction是可选的。

array.sort([compareFunction]);

未提供compareFunction时:

未提供compareFunction时,将遵循默认的排序模式,其中将数组的元素转换为字符串,然后根据UTF 16代码单元值进行比较,并且默认情况下以升序对元素进行排序。

例如对于字符串值,它遵循简单的UTF 16代码顺序。例如“香蕉”出现在“猫”之前

对于数字,它们首先被转换为字符串,然后根据UTF 16代码oder进行比较。因此,根据UTF 16顺序,将80和9分别转换为字符串“ 80”和“ 9”,并且“ 80”在“ 9”之前。

提供了compareFunction时:

提供compareFunction时,该函数将接管排序过程,并根据compareFunction的返回值,根据以下逻辑对所有未定义的元素进行排序。

如果compareFunction(a,b)返回负值,则a首先获得比b低的索引。

如果compareFunction(1,b)返回零,则两者都获得相同的索引,因此彼此之间的位置不变,但都与所有其他元素进行了排序。

如果compareFunction(a,b)返回正值,则a的索引要高于b,因此a在b之后。

您提供的示例使用技巧,通过从数组中减去每对数字来确定每个数字的相对权重。