📜  JavaScript数组sort()

📅  最后修改于: 2020-09-27 05:57:56             🧑  作者: Mango

JavaScript Array sort()方法对数组的项目进行排序。

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来比较数组的所有值。两个参数ab分别代表这两个值。

compareFunction应该返回一个Number 。此返回值用于通过以下方式对元素进行排序:

  • 如果返回值<0 ,则ab之前排序( ab之前)。
  • 如果返回值> 0 ,则ba之前排序( ba之前)。
  • 如果返回值== 0 ,则ab相对保持不变。

在示例2中,我们使用以下命令对数组进行排序:

function len_compare(a, b){
    return a.length - b.length;
}

这里:

  • 如果a.length-b.length <0 ,则ab之前。例如, “ Adam”“ Jeffrey”之前为4-7 <0
  • 如果a.length-b.length> 0 ,则ba之前。例如, “ 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 ,则ab之前。例如, 2出现在7之前,因为2-7 <0
  • 如果a-b> 0 ,则ba之前。例如, 1000排50之后,如1000-50> 0。

我们可以看到,这导致根据数字的升序对数字进行排序。

同样,我们可以使用b - a对其进行降序排序。请注意,我们还可以使用ES2015中定义的箭头函数表达式。

我们还可以使用内置数组reverse()方法反转(降序)排序后的数组。要了解更多信息,请访问JavaScript Array reverse()。