JavaScript IE 9:自定义排序函数

JavaScript IE 9: Custom sort function

本文关键字:排序 函数 自定义 IE JavaScript      更新时间:2023-09-26

在ie9中,如果我在控制台中输入:

[1, 4, 2, 3].sort(function (a, b) { return a < b; });

结果数组为:[1, 4, 2, 3] .

如果我在FF/Chrome中这样做,我得到了它,反向排序:[4, 3, 2, 1]

为什么这个不能在IE中工作?

编辑:是否有一个函数在那里抽象这些浏览器差异?换句话说,是否存在一个函数,我可以传递function(a, b) {return a <b;}并在所有浏览器中获得相同的结果?有什么开源的东西吗?>

可能是因为如果a较小,则函数应该返回-1,如果它们相等,则返回0,如果a较大,则返回1(反之亦然,如果您想要反向顺序)。编辑:事实上,它必须是零,一个正数或负数(正如@pimvdb所指出的,这就是我在下面的例子中使用的)。您的函数将永远不会返回-1,这可能会产生问题。

考虑13。您的函数为1 < 3返回1,这是可以的,但为3 < 1返回0。在一种情况下,数字是不同的,在另一种情况下,你说它们是相等的。

FF/Chrome以相反的顺序排序可能是由于他们使用的排序算法。

试题:

[1, 4, 2, 3].sort(function (a, b) { return b - a; });

Update:为了证实这一点,我们可以看一下规范,第15.4.4.11节Array.prototype.sort(comparefn),其中给出了必须由比较函数实现的属性:

函数comparefn是一组值S的一致比较函数,如果集合S中的所有值 A bc(可能是相同的值)满足下列所有要求:符号 A <<sub>CF b表示comparefn(A,b) <0; = <子> CF子> 是 comparefn (a, b) = 0(的信号);和> <子> CF子> 是 comparefn (a, b) > 0。

  • 调用comparefn(a,b)总是返回相同的值v,当给定一对特定值ab作为它的两个参数时。Type(v)为Number,且v不是NaN。注意,这意味着a <<sub>CF b中的一个, = <子> CF ,和> <子> CF子> 将适用于一个给定的
  • 调用comparefn(a,b)不会修改this对象。
  • = <子> CF (反射)
  • 如果 = <子> CF , b = <子> CF (对称)
  • 如果 = <子> CF b = <子> CF ,然后 = <子> CF c (传递性= <子> CF )
  • 如果 & lt; <子> CF b & lt; <子> CF ,然后 & lt; <子> CF c (传递性& lt; <子> CF )
  • 如果> <子> CF b > <子> CF ,然后> <子> CF c (动词> <子> CF )
以上条件是保证 comparfn 将集合S划分为多个等价类,且这些等价类是完全有序的必要且充分的。