用布尔值对象进行排序

时间:2014-07-18 14:47:16

标签: javascript arrays

我有一个带有名字的对象数组,如下所示:

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

我想按名称按字母顺序对这些对象进行排序,并使用以下排序函数来执行此操作:

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

这似乎有效,但是当比较函数返回布尔值时,我在规范中找不到sort应该如何运作的任何内容。这似乎不符合以下要求:如果a > b返回大于零的内容,a < b会返回小于零的内容,a === b会返回等于零的内容。

我想知道的是,是否会使用一个函数来返回一个布尔工作,以便在浏览器之间进行排序?

2 个答案:

答案 0 :(得分:2)

基本上,该函数始终返回01,但永远不会-1。即如果barfoo'bar' > 'foo')进行比较,则视为相等。

它可能无法跨浏览器一致地工作,因为实际的排序算法是依赖于实现的。由于您的函数永远不会返回-1,因此实际结果可能取决于元素的初始顺序。

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

答案 1 :(得分:0)

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

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

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