我的困难可能是我的数学文盲,但我试图在JavaScript数组中对某些数字进行排序,这是我在网上找到的解决方案。它确实有效,但我的问题是为什么?!我真的很想理解这段代码。
该网站,W3学校说:
您可以通过提供返回-1,0或1的函数来解决此问题:
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a,b){return a-b});
为什么只返回-1,0或1?我有谷歌搜索,返回可以返回你想要的任何值。
同样,如果这是一个令人难以置信的愚蠢问题,我道歉。
答案 0 :(得分:12)
排序回调必须返回
a < b
0
if a === b
a > b
需要三个可能的返回值,因为排序函数现在需要a
小于,等于或大于b
才能在结果中正确定位a
阵列。
如果您使用非数字数据(我想这就是W3Schools提到它的原因),那么返回-1
,0
和1
是很常见的。但是如果你使用数值数据,你可以简单地减去这些值,因为
a < b
则a - b < 0
,即负数a === b
则a - b === 0
,即0
a > b
则a - 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,则a
和b
相对于彼此保持不变,但相对于所有不同的元素进行排序。
注意: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)
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之后。
您提供的示例使用技巧,通过从数组中减去每对数字来确定每个数字的相对权重。