2014-07-18 63 views
1

我有对象的数组名,就像这样:与布尔值排序对象

myArray = [ 
      {name : 'foo'}, 
      {name : 'bar'}, 
      {name : 'Foo'} 
      ] 

我要排序这些字母数字对象的名字,并使用以下排序函数来进行:

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

这似乎是工作,但我无法找到在规范与问候什么sort应该如何当比较函数返回布尔值的功能。这似乎没有遵循如下要求:如果a > b返回大于零的值,则a < b返回小于零的值,并且a === b返回等于零的值。

我想知道的是,将使用一个函数返回一个布尔工作一致的跨浏览器排序?

+0

一个聪明的方法来做到这一点:http://stackoverflow.com/questions/17387435/javascript-sort-array-of-objects-by-a-boolean-property –

+0

我不能提供所有浏览器的证据,但我的假设是,它将任何值作为数字转换并将其舍弃('true | 0 == 1'),所以它很可能跨浏览器。 –

回答

2

基本上功能总是返回01,但从来没有-1。即如果将barfoo'bar' > 'foo')进行比较,则认为它们相等。

它可能无法在整个浏览器中一致地工作,因为实际的排序算法是与实现有关的。由于你的函数永远不会返回-1,实际结果可能取决于元素的初始顺序。

所以即使它看起来就像它工作正常,有些情况下它不会。你不能用布尔(真,假)表示三种状态(小,平等,大)。

+1

在1000个字符串的数组上运行这个函数后,我最终使用了'myArray.sort(function(a,b){return a.localeCompare(b)}'(在Chrome中进行测试) – ckersch

0

它可能适用于所有浏览器(你将不得不自己测试它们),但如果你不遵循规范,我不会依赖这种行为。尽管如此,因为true == 1false == 0,人们可能会认为浏览器的实现不是严格检查返回值的类型,而只是在比较中使用它。

你可能还没有意识到的另一件事是,排序可能不会做你的想法。你的比较函数实质上是说,即使这两个名字都是相同的。这是潜在的危险部分,因为不同的排序算法可能会以不同的方式使用比较器的结果,并且取决于浏览器使用的底层排序功能,数组中元素的初始顺序,有时甚至是大小和列表中的元素类型(你会感到惊讶),你可能会得到意想不到的结果。

只要return a.name ? a.name.localeCompare(b.name) : -1;,如果你真的想要一个班轮。