我理解为了对整数进行排序,我需要将compare函数传递给sort(),如下所示:
function(a, b){return a-b}
但我想知道的是这实际上是如何工作的。意思是,如果a-b的结果为负,则b在a之前排序,如果a-b为正,则a在b之前排序?是对的吗?如果a-b = 0,会发生什么?
答案 0 :(得分:1)
意思是,如果a-b的结果为负,则b在a之前排序,如果a-b为正,则a在b之前排序?是吗?
反过来说。如果返回值为负,则会a
之前放置b
。
如果a-b = 0,会发生什么?
这意味着价值相等,相对顺序无关紧要。
如果提供
compareFunction
,则根据比较函数的返回值对数组元素进行排序。如果a
和b
是要比较的两个元素,那么:
如果
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()
请注意,这(虽然更多涉及)可能比依赖稳定排序的双遍方法更快,因为当姓氏字段不同时,不需要进行比较。