默认情况下,数组 sort() 方法按字母升序排序。如果你想按其他顺序排序,因为你的数组包含数字或对象,那么你可以将函数传递给 sort()。
您传入的函数有两个参数,通常称为 a 和 b,并返回:
如果第一个参数应该排在第二个之前,则为负数 (a < b)
0 如果参数相等 (a==b)
如果第一个参数应排在第二个参数 (a > b) 之后,则为正数
现在,这是关键位:您作为参数传递给sort() 的函数将在处理整个数组时被sort() 重复调用。 sort() 不知道或不关心数组中事物的数据类型:每次它需要知道“项目 A 在项目 B 之前吗?”它只是调用你的函数。您无需担心 sort() 在内部使用何种类型的排序算法,实际上一个浏览器可能使用与另一个浏览器不同的算法,但这没关系,因为您只需要提供一种方法来比较任何两个项目从你的阵列。
您的函数可以有一个 if / else if / else 结构来决定返回什么结果,但是对于数字,简单地返回 (a-b) 将为您实现这一点,因为减法的结果将是 -ve、0 或 +ve 并正确地将数字放入升序。返回 (b-a) 会使它们下降:
var sortedArray = myArray.sort(function(a,b){
return (a-b);
});
如果您有一个对象数组并且想要对对象的某个或多个特定属性进行排序,您也可以这样做。假设,例如,这种格式的对象:
{ id : 1,
name : "Fred",
address : "12 Smith St",
phone : "0262626262" }
然后,您可以按“id”属性对此类对象的数组进行排序,如下所示:
var sortedArray = myArray.sort(function(a,b){
return (a.id - b.id);
});
或者您可以按“名称”属性(按字母顺序)对此类对象的数组进行排序,如下所示:
var sortedArray = myArray.sort(function(a,b){
if (a.name < b.name)
return -1;
else if (a.name == b.name)
return 0;
else
return 1;
});
请注意,在我的最后一个示例中,我放置了前面提到的完整的 if / else if / else 结构。
对于您正在对具有多个属性的对象进行排序的示例,您可以进一步扩展以包括二次排序,也就是说,(在我的示例中)如果名称属性相等,则您可以返回电话属性的比较。