使用Chrome排序Javascript数组?

jan*_*mon 25 javascript arrays sorting google-chrome

有没有办法使用Chrome对数组进行排序?


使用sort函数不起作用,如下例所示:

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] )
}
Run Code Online (Sandbox Code Playgroud)

Firefox/IE/Opera/Safri输出: 54321

Chrome输出: 53241

jsBin的例子


谢谢你的时间!

Kob*_*obi 35

这似乎是标准的,返回负数,正数或零数.

myArray.sort ( function( a , b ){
  return a-b;
});
Run Code Online (Sandbox Code Playgroud)

http://www.w3schools.com/jsref/jsref_sort.asp


Ksh*_*KJ- 17

Chrome的行为是正确的:)

ECMA标准要求将函数传递给sort()以返回大于0,小于0或等于0的数字.但是,您定义的函数返回true/false.ECMA标准规定,对于不按预期运行的功能,实施取决于客户端.

读这个


Ped*_*uki 9

由于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;
});
Run Code Online (Sandbox Code Playgroud)

对于原始对象,可以使用短版本

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

// ascending order
abc.sort(function( a , b ){
  return a - b; 
});
Run Code Online (Sandbox Code Playgroud)

对于像这样的对象

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 }  
Run Code Online (Sandbox Code Playgroud)

正确的方法是:

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

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