<分区>
我知道要对整数进行排序,我需要像这样将一个比较函数传递给 sort():
function(a, b){return a-b}
但我想知道这实际上是如何运作的。意思是,如果 a-b 的结果为负,则 b 排在 a 之前,如果 a-b 为正,则 a 排在 b 之前?是对的吗?如果 a-b = 0 会怎样?
<分区>
我知道要对整数进行排序,我需要像这样将一个比较函数传递给 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 中的替换
用于对格式为 dd MMM yyyy 的日期列表进行排序的 Java 程序
javascript - 使用 Sequelize JS 更新模型
javascript - 如何通过函数执行指令并检索它创建的样式
javascript - 使用 new function(){} 构造对象与使用 (function(){})() 调用函数 - 性能?