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中测试)