JavaScript IE 9:自定义排序功能

时间:2011-09-21 14:26:41

标签: javascript internet-explorer sorting internet-explorer-9

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

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

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

如果我在FF / Chrome中执行此操作,我会得到它,反向排序:[4, 3, 2, 1]

为什么这在IE中不起作用?

编辑:是否有一个功能抽象出这些浏览器的差异?换句话说,是否有一个函数我可以传递函数(a,b){return a&lt; b;在所有浏览器中获得相同的结果?任何开源的东西?

1 个答案:

答案 0 :(得分:8)

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

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

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

尝试:

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

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

  

函数 comparefn 是一组值S的一致比较函数,如果所有值满足以下所有要求 a S中的> b 和 c (可能是相同的值):符号 a &lt; CF b 表示 comparefn(a,b)&lt; 0; a = CF b 表示 comparefn(a,b) = 0(任一符号);和 a &gt; CF b 表示 comparefn(a,b)&gt; 0

     
      
  • 当给出一对特定值 a b 作为其两个值时,调用 comparefn(a,b)始终返回相同的值v参数。此外,类型( v )是数字, v 不是 NaN 。请注意,这意味着 a &lt; CF b 中的一个,    a = CF b a &gt; CF b <对于给定的一对 a b ,/ em>将为true。
  •   
  • 调用 comparefn(a,b)不会修改对象。
  •   
  • a = CF a (反身性)
  •   
  • 如果 a = CF b ,那么 b = CF a (对称)
  •   
  • 如果 a = CF b b = CF c ,然后 a = CF c (传递性= CF
  •   
  • 如果 a &lt; CF b b &lt; CF < em> c ,然后 a &lt; CF c (&lt; CF 的传递性)< / LI>   
  • 如果 a &gt; CF b b &gt; CF < em> c ,然后 a &gt; CF c (传递&gt; CF )< / LI>   
     

注意上述条件是必要且足以确保 comparefn 将集合S划分为等价类,并且这些等价类是完全有序的。