javascript - 这个 JavaScript 数字比较函数实际上是如何工作的?

标签 javascript function sorting integer compare

<分区>

我知道要对整数进行排序,我需要像这样将一个比较函数传递给 sort():

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

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

最佳答案

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

在实践中,具有相同键的排序函数的行为具有一定的重要性。当键相等时,将条目按照它们所在的顺序(相对于彼此)的排序称为 稳定 排序。在 JavaScript 中,.sort() API 被明确指定为不一定稳定。这意味着排序函数可能给您留下一个数组,其中在排序完成时交换比较相等的两个元素。

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

var list = [{
  firstName: "Louis",
  lastName: "Adams",
  // ...
}, {
  // ...
}];

因此,具有名字字段和姓氏字段的对象。如果 JavaScript .sort() API 需要稳定,那么您可以按照人们期望的方式对列表进行排序:

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);
});

也就是说,您可以按名字排序,然后按姓氏排序,这样您就有了一个按姓氏排序的列表,您可以确定“Adams, John”会在在“亚当斯,扎克”之前列出。 (请注意,我们排序的第一个不太重要的键。)

但是,JavaScript .sort() API 不一定稳定,因此您不能依赖它。相反,您必须通过 .sort() 一次性完成所有您想要的排序比较:

function ocompare(o1, o2) {
  var keys = [];
  for (var i = 2; i < arguments.length; keys[i] = arguments[i], ++i);

  for (i = 0; i < keys.length; ++i) {
    if (o1[keys[i]] < o2[keys[i]])
      return -1;
    if (o1[keys[i]] > o2[keys[i]])
      return 1;
  }
  return 0;
}
list.sort(function(o1, o2) {
  return ocompare(o1, o2, "lastName", "firstName");
});

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

关于javascript - 这个 JavaScript 数字比较函数实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32635908/

相关文章:

Java Collections.sort() 排除字符范围

javascript - 在 AngularJS 应用程序中的多个 ng-views 上使用 Bootstrap Datetimepicker DOM 对象

javascript - string.AngularJs 中的替换

javascript - 在函数内访问覆盖的全局变量

python - 使用比较器函数进行排序

用于对格式为 dd MMM yyyy 的日期列表进行排序的 Java 程序

javascript - 使用 Sequelize JS 更新模型

javascript - 如何通过函数执行指令并检索它创建的样式

javascript - 使用 new function(){} 构造对象与使用 (function(){})() 调用函数 - 性能?

C - 结构内的函数