1

在IE 9,如果我在控制台输入:JavaScript的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){返回一个< b; }并在所有浏览器中获得相同的结果?任何开源的东西?

+0

的可能的复制http://stackoverflow.com/questions/4782893/ie9-javascript-sort-order-why – JaredMcAteer

+0

我看到这个答案已经链接,但我不知道如何使它在IE浏览器就像它在FF/Chrome中一样。 – IEHaterNumber1

回答

8

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

考虑13。你的函数返回11 < 3,这没问题,但是返回03 < 1。在一个案例中,这个数字是不同的,在另一个案例中你说他们是平等的。

FF/Chrome按相反顺序对它进行排序可能是由于它们使用的排序算法。

尝试:

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

更新:为了证实这一点,我们可以看一下说明书,第15.4.4.11 Array.prototype.sort(comparefn),其中属性赋予它必须由一个比较函数来实现:

函数comparefn是一组值S的一致比较函数,如果所有的下面都满足所有值的要求一个b,和Ç(可能相同的值)在该组S:记号一个 < CFb装置comparefn(A,B) < 0; a = CFb意味着comparefn(a,b) = 0(任一符号);和a> CFb意味着comparefn(a,b)> 0。

  • 调用comparefn(A,B)给出了具体的一对值一个b作为它的两个参数时总是返回相同的值v。此外,类型(v)是Number,并且v不是NaN。注意,这意味着,一个 < CFb,的恰好一个 一个 = CFb,和一个> CFb将为真对于给定的双a and b
  • 调用comparefn(a,b)不修改对象。
  • 一个 = CF一个(自反)
  • 如果一个 = CFb,然后b = CF一个(对称)
  • 如果a = CFbb = CFÇ,然后一个 = CFÇ(的传递性= CF
  • 如果一个 < CFbb < CFc,然后一个 < CFÇ(及物< CF的)
  • 如果一个> CFbb> CFÇ,然后一个> CFc(transiti > CF

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

+2

+1虽然它是一个负数/正数/零数。您的并不总是返回'-1','1'或'0' :) – pimvdb

+0

@pimvdb:Right :) –

+0

ES5#15.4.4.11 - 您必须返回'1','0'或'-1 '在自定义排序功能中。 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf – c69