Chome Array.sort和FF之间的区别

时间:2013-12-06 14:17:34

标签: javascript

这很简单:

list.sort(function(a, b){return a.priority < b.priority;});

其中列表项类似于{priority: 2, foo: "bar"}

在两个主要浏览器上表现不一样,我做错了什么?

http://jsfiddle.net/8NCXr/1/

enter image description here

3 个答案:

答案 0 :(得分:2)

你应该在sort()函数中返回一个数字而不是一个布尔值:1,0或-1。这些数字代表比较元素应该行进的方向(向上,停留或向下)。布尔值不会给你这个控件,所以最有可能取决于浏览器如何处理它(因此在浏览器之间有所不同)。

查看Array.prototype.sort上的文档。

假设升序排序:

list.sort(function(a, b){
  return a.priority > b.priority ? 1
       : a.priority < b.priority ? -1
       : 0;
});

// yields priorities of: [-8,-7,-3,0,1,3,12,29,30,200,1992]

答案 1 :(得分:0)

如果你喜欢在展位浏览器中工作,你应该改变两件小事。

首先你如何解析ur int。

list.forEach(function(data){data.priority = parseInt(data.priority,10);});

然后排序,所以它返回一个方向,而不是真/假。

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

这是你的小提琴,但updated有修复。

答案 2 :(得分:0)

return a.priority < b.priority;

这不是有效的比较功能。返回0(或false,在您的情况下)将意味着这两个项目被认为是相同的 - 它们并非总是如此。为了保持一致,比较函数需要满足等式

comp(a, b) == -1 * comp(b, a)
// or, if not only the values -1, 0 and 1 are allowed:
comp(a, b) * comp(b, a) <= 0

如果该要求被破坏,排序将表现为未定义。

引用ES5.1 spec on sort

  

如果comparefn不是该数组元素的一致比较函数,则sort的行为是实现定义的。

     

如果所有值comparefnS和{满足以下所有要求,则函数a是一组值b的一致比较函数集合c中的{1}}(可能是相同的值):符号S表示a <CF b; comparefn(a,b) < 0表示a =CF b(任一标志); comparefn(a,b) = 0表示a >CF b

     

当给定一对特定值comparefn(a,b) > 0comparefn(a,b)作为其两个参数时,调用v始终返回相同的值a。此外,b是数字,Type(v)不是v。请注意,这意味着对于给定的NaNa <CF b对,a =CF ba >CF ba中只有一个为真。

     
      
  • 调用b不会修改此对象。
  •   
  • comparefn(a,b)(反身性)
  •   
  • 如果a =CF a,则a =CF b(对称)
  •   
  • 如果b =CF aa =CF b,则b =CF ca =CF c的及物性传承
  •   
  • 如果=CFa <CF b,则b <CF ca <CF c的及物性传承
  •   
  • 如果<CFa >CF b,则b >CF ca >CF c的及物性传承
  •   
     

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

要比较JavaScript中的数字(反向),只需

S