javascript实现数组排序的方法

240 阅读2分钟

介绍

在我们实际的开发中,我们经常会遇到对数组进行排序的操作,所谓排序,就是使一串记录按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。同时排序也是算法的一种,javascript内置的sort函数是多种排序算法的集合,数组在原数组上进行排序。JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。

简单排序

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>简单排序</title>
    </head>
    <body>
        <script type="text/javascript">
           var numbers=[11,31,22,15,89,32,10];
            numbers.sort();//调用数组内置排序方法
            console.log(numbers);//[10, 11, 15, 22, 31, 32, 89]
            numbers.reverse();//将数组进行反转
            console.log(numbers);//[89, 32, 31, 22, 15, 11, 10]
        </script>
    </body>
</html>

经过上面的操作,看式我们已经达到了目的,但是还是拥有问题,请看下面。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>简单排序</title>
    </head>
    <body>
        <script type="text/javascript">
           var numbers=[11,31,22,15,89,32,100];
            numbers.sort();//调用数组内置排序方法
            console.log(numbers);//[100, 11, 15, 22, 31, 32, 89]
            numbers.reverse();//将数组进行反转
            console.log(numbers);//[89, 32, 31, 22, 15, 11, 100]
        </script>
    </body>
</html>

不知道你们发现问题没有,我们仅仅是将10换成了100,但是100还是排在了最前面,与我们的想法严重不符合。

但是这是为啥呢?本身sort()这个方法是没有问题的,在默认情况下,sort()方法按升序排列数组项,即最小的值位于最前面,最大的值排在最后面。

为了实现升序,sort() 方法会调用每个数组项的toString() 转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。为了更好的实现排序,sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于那个值的前面。

简单数组自定义排序

function arrAsc(a, b) { //实现数组升序的方法
            if (a > b) {
                return 1;
            } else if (a < b) {
                return -1;
            } else {
                return 0;
            }
        }
        numbers.sort(arrAsc); //调用数组升序的方法
        console.log(numbers); //[11, 15, 22, 31, 32, 89, 100]
        function arrDesc(a, b) { //实现数组降序的方法
            if (a > b) {
                return -1;
            } else if (a < b) {
                return 1;
            } else {
                return 0;
            }
        }
        numbers.sort(arrDesc); //调用数组降序的方法
        console.log(numbers); //[100, 89, 32, 31, 22, 15, 11]

在这里我们定义了一个compare比较函数,当a>b的结果为整数时则为升序,当a>b的结果为负数时则为降序。

简单对象自定义属性排序

var friuts = [
            {
                name: 'apple',
                price: 18.5,
                count: 10
            },
            {
                name: 'pear',
                price: 1.5,
                count: 5,
            },
            {
                name: 'banana',
                price: 20.5,
                count: 20
            },
        ]
        //未排序前
        console.log(JSON.stringify(friuts));//[{"name":"apple","price":18.5,"count":10},{"name":"pear","price":1.5,"count":5},{"name":"banana","price":20.5,"count":20}]
        //按价格升序排序
        friuts.sort(function (x, y) {
            return x.price - y.price;
        });
        console.log(JSON.stringify(friuts));//[{"name":"pear","price":1.5,"count":5},{"name":"apple","price":18.5,"count":10},{"name":"banana","price":20.5,"count":20}]
        //按名称排序
        friuts.sort(function (x, y) {
            if (x.name > y.name) {
                return 1;
            } else if (x.name < y.name) {
                return -1;
            } else {
                return 0;
            }
        });
        console.log(JSON.stringify(friuts));//[{"name":"apple","price":18.5,"count":10},{"name":"banana","price":20.5,"count":20},{"name":"pear","price":1.5,"count":5}]

通用的排序方法

var friuts = [
            {
                name: 'apple',
                price: 18.5,
                count: 10
            },
            {
                name: 'pear',
                price: 1.5,
                count: 5,
            },
            {
                name: 'banana',
                price: 20.5,
                count: 20
            },
        ]
        var sortExp = function (key, isAsc) {

            return function (x, y) {
                if (isNaN(key)) {
                
                    if (x[key] > y[key]) {
                        return 1 * (isAsc ? 1 : -1);

                    } else if (x[key] < y[key]) {
                        return -1 * (isAsc ? 1 : -1);
                    } else {
                        return 0;
                    }

                } else {
                    return (x[key] - y[key]) * (isAsc ? 1 : -1)
                }
            }
        }
        //价格升序
        friuts.sort(sortExp('price', true));
        console.log(JSON.stringify(friuts));
        //价格降序
        friuts.sort(sortExp('price', false));
        console.log(JSON.stringify(friuts));
        //名称升序
        friuts.sort(sortExp('name', true));
        console.log(JSON.stringify(friuts));
        //名称降序
        friuts.sort(sortExp('name', false));
        console.log(JSON.stringify(friuts));
        //数量升序
        friuts.sort(sortExp('count', true));
        console.log(JSON.stringify(friuts));
        //数量降序
        friuts.sort(sortExp('count', false));
        console.log(JSON.stringify(friuts));

image.png

学习并转载自:www.cnblogs.com/jjgw/