个性化阅读
专注于IT技术分析

JS数组排序 – JavaScript教程

上一章JavaScript教程请查看:JS数组Array及其用法

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

数组排序

排序是处理数组时的一项常见任务。例如,如果你希望按字母顺序显示城市或县的名称,那么可以使用它。

JavaScript数组对象有一个内置的方法sort(),用于按字母顺序对数组元素进行排序。下面的例子演示了它是如何工作的:

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

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

反转一个数组

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

该方法以这样一种方式反转数组:第一个数组元素变成最后一个,最后一个数组元素变成第一个。这里有一个例子:

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

alert(counts); // 输出: five,four,three,two,one
alert(reversed); // 输出: five,four,three,two,one

注意: sort()和reverse()方法修改原始数组并返回对相同数组的引用,正如你在上面的示例中看到的那样。

数字数组排序

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

var numbers = [5, 20, 10, 75, 50, 100];
numbers.sort(); // 数组排序
alert(numbers); // 输出: 10,100,20,5,50,75

如你所见,结果与我们所预料的不一样。这是因为,sort()方法通过将数字数组元素转换为字符串(即20变成“20”,100变成“100”,依此类推)来对它们进行排序,而且由于字符串“20”的第一个字符(即“2”位于字符串“100”的第一个字符之后(即这就是为什么值20在100之后排序的原因。

要解决这个排序问题与数字数组,你可以通过一个比较函数,像这样:

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

// 数组排序使用compare函数
numbers.sort(function(a, b) {
    return a - b;
});
alert(numbers); // 输出: 5,10,20,50,75,100

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

在指定比较函数时,将根据比较函数的返回值对数组元素排序。例如,在比较a和b时:

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

因此,因为-15=5 – 20小于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];

// 定义函数来查找最大值
function findMax(array) {
    return Math.max.apply(null, array);
}

// 定义函数来查找最小值
function findMin(array) {
    return Math.min.apply(null, array);
}

alert(findMax(numbers)); // : 15
alert(findMin(numbers)); // : -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 }
];

// 按年龄排序
persons.sort(function (a, b) {
    return a.age - b.age;
});

console.log(persons);

// 按名字排序
persons.sort(function(a, b) {
    var x = a.name.toLowerCase(); // 忽略大小写
    var y = b.name.toLowerCase(); // 忽略大小写
    if(x < y) {
        return -1;
    }
    if(x > y) {
        return 1;
    }
    // 名称必须相等
    return 0;
});

console.log(persons);
赞(0)
未经允许不得转载:srcmini » JS数组排序 – JavaScript教程

评论 抢沙发

评论前必须登录!