用Chrome如何对Javascript数组进行排序?

34

有没有办法在Chrome浏览器中使用排序函数来对数组进行排序?


使用排序函数无法正常工作,如下例所示:

var myArray = [1,4,5,3,2];

myArray.sort ( function( a , b ){
  return b>a
});

for ( var i = 0; i < myArray.length; i++ )
{
  document.write( myArray[i] )
}

Firefox / IE / Opera / Safari的输出结果为:54321

Chrome的输出结果为:53241

jsBin示例


感谢您的时间!

4个回答

48

当以“mm/dd/yyyy”格式排序日期时,相同的解决方案无法正常工作。 - Swapnil Yeole

25

Chrome的行为是正确的 :)

ECMA标准要求传递给sort()函数的函数必须返回大于0、小于0或等于0的数字。然而,您定义的函数返回true/false。ECMA标准规定对于不符合预期行为的函数,实现取决于客户端。

阅读此内容


20

由于ECMA标准涵盖了有关排序数组的内容(以非常简化的方式):

  • 如果比较接收到1,则A向下移动一个位置。
  • 如果接收到-1,则保持位置并将排名优先于B。
  • 如果接收到0,则不执行任何操作。

确保在所有浏览器中保证相同行为的最安全方法是:

// descending order
abc =[10,2,4,1]; 
abc.sort(function( a , b ){
  return a > b ? -1 : 1;
});

// ascending order
abc.sort(function( a , b ){
  return a > b ? 1 : -1;
});
可以使用短版来处理原始对象。
// descending order
abc.sort(function( a , b ){
  return b - a; 
});

// ascending order
abc.sort(function( a , b ){
  return a - b; 
});

如果您有以下数组:

var items = [
       { name: 'Edward', value: 21 },
       { name: 'Sharpe', value: 27 },
       { name: 'And', value: 31 },
       { name: 'The', value: -12 },
       { name: 'Zeros', value: 37 },
       { name: 'Magnetic', value: 37 } 
]

正确的方法是:

 items.sort(function( a , b ){
   var result = a == b ? 0 : b > a ? -1 : 1
   if(result === 0)
   {
     // implement a tight break evaluation
   }
   return result ;
  });

这是正确的方法,因为浏览器迭代的方式在ECMA标准中没有定义,而且不同的浏览器可能会以不同的方式进行迭代。例如,大多数浏览器从上到下迭代,但Chrome会将第一个元素与最后一个元素一起迭代并向上移动。因此,在紧密的情况下,大多数浏览器的结果可能会有所不同。


1
这是对我有效的解决方法,无论是在Chrome还是其他浏览器中,与其他答案相反。 - Régis B.
谢谢,我已经为这个问题发愁了一个小时了。在Safari中可以运行,但在Chrome中却不行。 - umunBeing

3

我来晚了,如果我有误解,请原谅。你提供的链接讨论的是Chrome的排序稳定性,当多个元素评估为相同排名时会出现这种情况。但这与此处所问问题不同,在这里每个项目都有一个独特的排名。 - Aidy J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接