JavaScript 排序数组

在本教程中,你将学习如何在 JavaScript 中对数组元素进行排序。

对数组进行排序

使用数组时,排序是一项常见任务。例如,如果要按字母顺序显示城市或县名,则可以使用它。

JavaScript Array 对象具有按字母顺序对数组元素进行排序的内置 sort() 方法。以下示例演示了它的工作原理:

var fruits = ["Banana", "Orange", "Apple", "Papaya", "Mango"];
var sorted = fruits.sort();

alert(fruits); // Outputs: Apple,Banana,Mango,Orange,Papaya
alert(sorted); // Outputs: Apple,Banana,Mango,Orange,Papaya

反转数组

你可以使用 reverse() 方法来反转数组元素的顺序。

此方法以一种方式反转数组,即第一个数组元素成为最后一个,最后一个数组元素成为第一个数组元素。这是一个例子:

var counts = ["one", "two", "three", "four", "five"];
var reversed = counts.reverse(); 

alert(counts); // Outputs: five,four,three,two,one
alert(reversed); // Output: five,four,three,two,one

注意: sort()reverse() 方法修改原始数组,返回相同的数组的引用,你可以在上面的例子中看得出。

排序数字数组

sort() 方法应用于数值数组(即包含数值的数组)时,该方法可能会产生意外结果。例如:

var numbers = [5, 20, 10, 75, 50, 100];
numbers.sort(); // Sorts numbers array
alert(numbers); // Outputs: 10,100,20,5,50,75

如你所见,结果与我们的预期不同。之所以发生这种情况,是因为该 sort() 方法通过将数值数组元素转换为字符串来对其进行排序(即 20 变为 20 ,100 变为 100 ,依此类推),并且因为字符串 20 的第一个字符(即 2) )在字符串 100 的第一个字符(即 1)之后出现,这就是为什么值 20 在 100 之后排序的原因。

要使用数值数组修复此排序问题,你可以传递比较函数,如下所示:

var numbers = [5, 20, 10, 75, 50, 100];

// Sorting an array using compare function
numbers.sort(function(a, b) {
    return a - b;
});
alert(numbers); // Outputs: 5,10,20,50,75,100

如你所见,这次我们得到了正确的结果。让我们看看它是如何工作的。

指定 compare 函数时,将根据 compare 函数的返回值对数组元素进行排序。例如,比较 ab 时:

  • 如果 compare 函数返回的值小于 0,则 a 首先出现。
  • 如果 compare 函数返回的值大于 0,则 b 首先出现。
  • 如果 compare 函数返回 0, a 并且 b 相对于彼此保持不变,但是相对于所有其他元素排序。

因此,由于 5 - 20 = -15 小于 0,因此 5 首先出现,类似地 20 - 10 = 10 大于 0,因此 10 出现在 20 之前,同样 20 - 75 = -55 小于 0,所以 20 出现在 75 之前,类似地 50 出现在 75 之前,依此类推。

查找数组中的最大值和最小值

你可以使用 apply() 方法结合 Math.max()Math.min() 来找到数组里面的最大值和最小值,像这样:

var numbers = [3, -7, 10, 8, 15, 2];

// Defining function to find maximum value
function findMax(array) {
    return Math.max.apply(null, array);
}

// Defining function to find minimum value
function findMin(array) {
    return Math.min.apply(null, array);
}

alert(findMax(numbers)); // Outputs: 15
alert(findMin(numbers)); // Outputs: -7

apply() 方法提供了一种方便的方法,将数组值作为参数传递给以类似数组的方式接受多个参数的函数,但不是数组(例如此处的 Math.max()Math.min() 方法)。因此, Math.max.apply(null, numbers) 上面示例中的结果语句等同于 Math.max(3, -7, 10, 8, 15, 2)

排序对象数组

sort() 方法还可用于使用 compare 函数对对象数组进行排序。

以下示例将向你展示如何按属性值对对象数组进行排序:

var persons = [
    { name: "Harry", age: 14 },
    { name: "Ethan", age: 30 },
    { name: "Peter", age: 21 },
    { name: "Clark", age: 42 },
    { name: "Alice", age: 16 }
];

// Sort by age
persons.sort(function (a, b) {
    return a.age - b.age;
});

console.log(persons);

// Sort by name
persons.sort(function(a, b) {
    var x = a.name.toLowerCase(); // ignore upper and lowercase
    var y = b.name.toLowerCase(); // ignore upper and lowercase
    if(x < y) {
        return -1;
    }
    if(x > y) {
        return 1;
    }
    // names must be equal
    return 0;
});

console.log(persons);