我有一个带有名字的对象数组,如下所示:
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 :(得分:2)
基本上,该函数始终返回0
或1
,但永远不会-1
。即如果bar
与foo
('bar' > 'foo'
)进行比较,则视为相等。
它可能无法跨浏览器一致地工作,因为实际的排序算法是依赖于实现的。由于您的函数永远不会返回-1
,因此实际结果可能取决于元素的初始顺序。
所以即使看起来就像它正常工作一样,但有些情况下它不会成功。你不能用布尔表示三种状态(更小,相等,更大)(真,假)。
答案 1 :(得分:0)
它可能适用于所有浏览器(您必须自己测试),但如果您不遵循规范,我就不会依赖此行为。仍然,因为true == 1
和false == 0
,人们可能会认为浏览器的实现并不严格检查返回值的类型,而只是在比较中使用它。
你可能没有意识到的另一件事是那种可能不符合你的想法。您的比较器函数基本上说即使a.name < b.name
,两个名称都是相同的。这是潜在的危险部分,因为不同的排序算法可能以不同的方式使用比较器的结果,并且取决于浏览器使用的基础排序函数,数组中元素的初始顺序,有时甚至是大小和列表中的元素类型(你会感到惊讶),你可能会得到意想不到的,不准确的结果。
如果你真的想要一个单行,只需return a.name ? a.name.localeCompare(b.name) : -1;
。