Array 重排序详解

重排序需求

当我们拿到一组数据之后,很大可能是用Array类型存放的。那么我们在使用的过程中,很可能需要对数据内的元素进行重新排序,让页面显示出我们需要的顺序,或者让数据按照我们需要的顺序排列。


重排序方法

1. reverse()
2. sort()

reverse()

说明:该函数反转数组的顺序

var values = [1, 2, 3, 4, 5];
values.reverse();
alert(values); //[5,4,3,2,1]

sort()

说明:该函数默认升序排列数组项 -- 即最小值在前,最大值在后。
排序转换逻辑过程:为了实现排序, sort()  方法会调用每个数组项的 toString()  转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值, sort()  方法比较的也是字符串。

var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); //[0,1,10,15,5]

可以看到 10 位于 5 之前,这是因为它排序的时候是按字符串排序,那么元素将按照 ASCII 字符顺序进行排序,字符串比较的
时候是按照顺序逐个比较大小。(当然这不是我们想要的)

sort() 可以带参数,参数为函数,这个参数是比较函数

比较函数接收两个参数, 如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0 ,如果第一个参数应该位于第二个之后则返回一个正数以下就是一个简单的比较函数:

function compare(value1, value2) {
    if (value1 < value2) {
        return -1;
    } else if (value1 > value2) {
        return 1;
    } else {
        return 0;
    }
}

那么这样就可以看到预期的结果

var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); //[0,1,5,10,15]

利用 sort 进行数组对象排序(如果数组项是对象,我们需要根据数组项的某个属性对数组进行排序)

原理相同

var arr = [{name: "zlw", age: 24}, {name: "wlz", age: 25}];
var compare = function (obj1, obj2) {
    var val1 = obj1.name;
    var val2 = obj2.name;
    if (val1 < val2) {
        return -1;
    } else if (val1 > val2) {
        return 1;
    } else {
        return 0;
    }
}
console.log(arr.sort(compare));

输出结果为

[Object { name="wlz", age=25}, Object {name="zlw", age=24}] 

可以看到数组已经按照 name  属性进行了排序。
如果我希望按照 age 排序

var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];
        if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }
    }
}

如果想按照 age  进行排序, arr.sort(compare("age"))  即可。

这里还有一个问题,如果数组是 var arr = [{name: "zlw", age:"24"}, {name: "wlz", age: "5"}]; 那么将会是字符串比较,即会出错。

var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];
        if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
            val1 = Number(val1);
            val2 = Number(val2);
        }
        if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }
    }
}

扩展内容


sort() 底层实现网址
https://github.com/v8/v8/blob/ad82a40509c5b5b4680d4299c8f08d6c6d31af3c/src/js/array.js
第 710 行

说明:不同的引擎代码底层实现原理不同
以 V8 引擎为例
V8  引擎 sort  函数只给出了两种排序 InsertionSort  和QuickSort ,数量小于 10 的数组使用 InsertionSort ,比10 大的数组则使用 QuickSort 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值