默认情况下,数组sort() 方法按字母升序排序。如果您想按其他顺序排序,因为您的数组包含数字或对象,那么您可以将一个函数传递给sort()。
你传入的函数有两个参数,通常称为 a 和 b,并返回:
如果第一个参数应该排在第二个之前,则为负数 (a b)
现在,这里是关键位:作为参数传递给sort() 的函数将被sort() 重复调用,因为它处理整个数组。 sort() 不知道也不关心数组中事物的数据类型:每次它需要知道“项目 A 是否在项目 B 之前?”它只是调用你的函数。您无需担心sort() 在内部使用哪种类型的排序算法,实际上一个浏览器可能使用与另一个不同的算法,但这没关系,因为您只需要为其提供一种比较任何两个项目的方法来自你的数组。
你的函数可以有一个if / else if / else 结构来决定返回什么结果,但是对于数字来说,简单地返回 (ab) 将为你实现这一点,因为减法的结果将是 -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 结构。
对于您正在对具有多个属性的对象进行排序的示例,您可以将其进一步扩展以包含辅助排序,也就是说,(在我的示例中)如果名称属性相等,您可以返回一个比较,例如电话属性。