这是对 API 进行排序的常见模式。如果返回值为 0,则表示项目(为了排序)相等。
在实践中,具有相等键的排序函数的行为具有一定的重要性。当键相等时,按照它们所在的顺序(相对于彼此)离开条目的排序称为 stable 排序。在 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”会出现在列在“亚当斯,扎克”之前。 (请注意,我们排序的 first 是 less 重要的键。)
但是,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");
});
请注意,这(虽然涉及更多一点)可能比执行依赖于稳定排序的两遍方法更快,因为当姓氏字段不同时不需要进行比较。