Javascript 用布尔值排序对象

Javascript 用布尔值排序对象,javascript,arrays,Javascript,Arrays,我有一组有名称的对象,如下所示: myArray = [ {name : 'foo'}, {name : 'bar'}, {name : 'Foo'} ] 我想按名称对这些对象进行字母数字排序,并使用以下排序函数进行排序: myArray.sort(function(a,b){ return a.name > b.name; }); 这似乎是可行的,但是我在规范中找不到任何关于当比较函数返回布尔值

我有一组有名称的对象,如下所示:

myArray = [
           {name : 'foo'},
           {name : 'bar'},
           {name : 'Foo'}
          ]
我想按名称对这些对象进行字母数字排序,并使用以下排序函数进行排序:

myArray.sort(function(a,b){
  return a.name > b.name;
});
这似乎是可行的,但是我在规范中找不到任何关于当比较函数返回布尔值时,
sort
应该如何工作的内容。这似乎不符合以下要求:如果
a>b
返回大于零的值,
a
返回小于零的值,
a==b
返回等于零的值


我想知道的是,使用一个返回布尔值的函数在不同浏览器之间进行排序时是否一致?

基本上,该函数总是返回
0
1
,但从不返回
-1
。即,如果将
bar
foo
'bar'>'foo'
)进行比较,则认为两者相等

由于实际的排序算法依赖于实现,因此它可能无法在不同浏览器间一致工作。由于函数从不返回
-1
,因此实际结果可能取决于元素的初始顺序


因此,尽管它看起来工作正常,但在某些情况下却无法正常工作。你不能用布尔值(真、假)来表示三种状态(更小、相等、更大)。

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

你可能没有意识到的另一件事是,这类人可能没有按照你的想法行事。您的comparator函数本质上是说两个名称是相同的,即使
a.name
。这是一个潜在的危险部分,因为不同的排序算法可能以不同的方式使用比较器的结果,这取决于浏览器使用的底层排序函数、数组中元素的初始顺序,有时甚至是列表中元素的大小和类型(您会感到惊讶),您可能会得到意外的、不准确的结果


只是
返回一个名称?a、 name.localeCompare(b.name):-1如果你真的想要一行。

一个聪明的方法是:我不能为所有浏览器提供证据,但我的假设是,它将任何值转换回一个数字,并将其舍入(
true | 0==1
),因此它很可能跨浏览器工作。我最终使用了
myArray.sort(函数(a,b){return a.localeCompare(b)}
在1000个字符串的数组上运行此操作后,排序失败。(在chrome中测试)