sort()
方法以特定的升序或降序对给定数组的元素进行排序。
sort()
方法的语法为:
arr.sort(compareFunction)
在这里, arr是一个数组。
sort()参数
sort()
方法采用:
- compareFunction (可选)-用于定义自定义排序顺序。
从sort()返回值
- 在对数组中的元素进行适当排序之后返回数组(这意味着它将更改原始数组并且不进行任何复制)。
示例1:对数组的元素排序
如果未传递compareFunction ,
- 首先将所有非
undefined
数组元素转换为字符串。 - 然后使用它们的UTF-16代码点值比较这些字符串 。
- 升序排列。
- 所有
undefined
元素都排序到数组的末尾。
// sorting an array of strings
var names = ["Adam", "Jeffrey", "Fabiano", "Danil", "Ben"];
// returns the sorted array
console.log(names.sort());
// modifies the array in place
console.log(names);
var priceList = [1000, 50, 2, 7, 14];
priceList.sort();
// Number is converted to string and sorted
console.log(priceList)
输出
[ 'Adam', 'Ben', 'Danil', 'Fabiano', 'Jeffrey' ]
[ 'Adam', 'Ben', 'Danil', 'Fabiano', 'Jeffrey' ]
[ 1000, 14, 2, 50, 7 ]
在这里,我们可以看到names数组是按字符串的升序排序的。例如, 亚当排在Danil之前,因为“ A”排在“ D”之前。
由于所有未定义的元素在排序之前都会转换为字符串 ,因此Number
数据类型将按该顺序排序。
在这里,我们可以看到即使数字上的1000大于50 ,它也位于排序列表的开头。这是因为“ 1″ <“ 5″ 。
示例2:使用自定义函数排序
传递compareFunction时 ,
- 所有
undefined
数组元素均根据compareFunction的返回值进行排序。 - 所有未定义的元素都排序到数组的末尾,并且不为它们调用compareFunction 。
假设我们要对上述名称数组进行排序,以使最长的名称排在最后,而不是按字母顺序对其进行排序。我们可以通过以下方式做到这一点:
// custom sorting an array of strings
var names = ["Adam", "Jeffrey", "Fabiano", "Danil", "Ben"];
function len_compare(a, b){
return a.length - b.length;
}
// sort according to string length
names.sort(len_compare);
console.log(names);
输出
[ 'Ben', 'Adam', 'Danil', 'Jeffrey', 'Fabiano' ]
在此,排序基于逻辑a.length - b.length
。这基本上意味着长度较短的项目将出现在Array
的开头。
首先让我们了解可选的compareFunction
工作原理。
任何compareFunction
具有以下语法:
function (a, b){
// sorting logic
// return a Number
}
sort()
方法通过一次将两个值传递给compareFunction
来比较数组的所有值。两个参数a和b分别代表这两个值。
compareFunction
应该返回一个Number
。此返回值用于通过以下方式对元素进行排序:
- 如果返回值<0 ,则a在b之前排序( a在b之前)。
- 如果返回值> 0 ,则b在a之前排序( b在a之前)。
- 如果返回值== 0 ,则a和b相对保持不变。
在示例2中,我们使用以下命令对数组进行排序:
function len_compare(a, b){
return a.length - b.length;
}
这里:
- 如果a.length-b.length <0 ,则a在b之前。例如, “ Adam”在“ Jeffrey”之前为4-7 <0 。
- 如果a.length-b.length> 0 ,则b在a之前。例如, “ Danil”紧随“ Ben”之后为5-3 > 0。
- 如果a.length-b.length == 0 ,则它们的位置不变。例如, “ Jeffrey”和“ Fabiano”的相对位置不变,因为7-7 == 0 。
我们可以看到,这导致根据字符串的长度按升序对它们进行排序。
示例3:数字排序
由于所有未定义的元素在对它们进行排序之前都已转换为字符串 ,因此默认情况下我们无法使用其数字值对数字进行排序。
让我们看看如何使用自定义函数实现此函数。
// numeric sorting
// define array
var priceList = [1000, 50, 2, 7, 14];
// sort() using function expression
// ascending order
priceList.sort(function (a, b) {
return a - b;
});
// Output: Ascending - 2,7,14,50,1000
console.log("Ascending - " + priceList);
// sort() using arrow function expression
// descending order
priceList.sort((a, b) => b - a);
// Output: Descending - 1000,50,14,7,2
console.log("Descending - " + priceList);
输出
Ascending - 2,7,14,50,1000
Descending - 1000,50,14,7,2
在此示例中,我们使用以下命令对数组进行排序:
function (a, b) {
return a - b;
}
这里,
- 如果a-b <0 ,则a在b之前。例如, 2出现在7之前,因为2-7 <0 。
- 如果a-b> 0 ,则b在a之前。例如, 1000排在50之后,如1000-50> 0。
我们可以看到,这导致根据数字的升序对数字进行排序。
同样,我们可以使用b - a
对其进行降序排序。请注意,我们还可以使用ES2015中定义的箭头函数表达式。
我们还可以使用内置数组reverse()
方法反转(降序)排序后的数组。要了解更多信息,请访问JavaScript Array reverse()。