这个JavaScript数字比较函数如何实际工作?

时间:2015-09-17 16:55:02

标签: javascript function sorting integer compare

我理解为了对整数进行排序,我需要将compare函数传递给sort(),如下所示:

function(a, b){return a-b}

但我想知道的是这实际上是如何工作的。意思是,如果a-b的结果为负,则b在a之前排序,如果a-b为正,则a在b之前排序?是对的吗?如果a-b = 0,会发生什么?

2 个答案:

答案 0 :(得分:1)

  

意思是,如果a-b的结果为负,则b在a之前排序,如果a-b为正,则a在b之前排序?是吗?

反过来说。如果返回值为负,则会a之前放置b

  

如果a-b = 0,会发生什么?

这意味着价值相等,相对顺序无关紧要。

来自MDN documentation

  

如果提供compareFunction,则根据比较函数的返回值对数组元素进行排序。如果ab是要比较的两个元素,那么:

     
      
  • 如果compareFunction(a, b)小于0,则将a排序为低于b的索引,即a先来。

  •   
  • 如果c ompareFunction(a, b)返回0,则a和b相对于彼此保持不变,但是对所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。

  •   
  • 如果compareFunction(a, b)大于0,则将b排序为低于a的索引。

  •   

答案 1 :(得分:1)

这是排序API的常见模式。如果返回的值为0,则表示项目(为了排序目的)相等。

实际上,具有相同键的sort函数的行为具有一定的重要性。当密钥相等时,按照它们所处的顺序(相对于彼此)保留条目的排序称为稳定排序。在JavaScript中, (select array_agg(distinct address.zipcode) from affiliation join company on affiliation.ins_id = company.id join address on address.com_id = company.id where affiliation.per_id = person.id) AS zipcodes, API明确指定为不一定稳定。这意味着sort函数可能会为您留下一个数组,其中在排序完成时交换两个比较为相等的元素。

该行为会影响您使用.sort()功能的方式。我们假设您有一个对象列表:

.sort()

因此,具有名字字段和姓氏字段的对象。如果要求JavaScript var list = [{ firstName: "Louis", lastName: "Adams", // ... }, { // ... }]; API保持稳定,那么您可以按照人们希望通过这样做排序的方式对列表进行排序:

.sort()

也就是说,您可以对名字进行排序,然后对姓氏进行排序,并且您有一个按姓氏排序的列表,并且您确定" Adams ,约翰"将出现在"亚当斯,扎克和#34;之前的名单中。 (请注意,我们排序的第一个事物是 less 重要键。)

但是,JavaScript function ocompare(key, o1, o2) { return o1[key] < o2[key] ? -1 : o1[key] > o2[key] ? 1 : 0; } list.sort(function(o1, o2) { return ocompare("firstName", o1, o2); }); list.sort(function(o1, o2) { return ocompare("lastName", o1, o2); }); API不一定稳定,因此您无法依赖它。相反,您必须通过.sort()一次性完成所需的所有排序比较:

.sort()

请注意,这(虽然更多涉及)可能比依赖稳定排序的双遍方法更快,因为当姓氏字段不同时,不需要进行比较。