2019-07-22

146 阅读3分钟

js中的数组对象排序简单用法

一:普通数组

采用sort对数组进行排序时不带参数:

sort接收一个可选参数,是用来确定元素顺序的函数,若省略这个参数,则对数组内容根据ASCII码值的顺序排序:

let arr = ["a", "b", "A", "B"];
arr.sort();
console.log(arr);   //["A", "B", "a", "b"]

//A、B的ASCII值分别为65、66,而a、b的值分别为97、98,

数组中元素有数字时:

let arr = [12,54,'32',68,23];
arr.sort();
console.log(arr);   //[12, 23, "32", 54, 68]

sort在对数字进行排序时,会先对数组的每一项调用toString()方法将其转化为字符串,然后对字符串进行排序,

//A的ASCII值为65,而a、b的值分别为97、98,
let arr2 = ['a',12,'b',68,'A',189];
arr2.sort();
console.log(arr);   //[12, 189, 68, "A", "a", "b"]

所以若想对数字进行排序,则需对sort增加参数

sort带参数:

sort的参数是一个比较函数,比较函数接收两个参数,如果要按照升序排列,第一个参数小于第二个参数时返回一个负数,第一个参数大于第二个参数时返回一个正数,相等时返回0(此处为细节介绍,使用时可用箭头函数更简洁方便)

let arr = [23, 9, 4, 78, 3];
let compare = function (x, y) { //比较函数
    if (x < y) {
        return -1;
    } else if (x > y) {
        return 1;
    } else {
        return 0;
    }
}

console.log(arr.sort(compare));     //[3, 4, 9, 23, 78]

//或者采用箭头函数:
arr.sort((a, b) => { return a.age - b.age })    //[3, 4, 9, 23, 78]

若要降序排列时返回正负数交换即可

let compare = function (x, y) {
    if (x < y) {
        return 1;
    } else if (x > y) {
        return -1;
    } else {
        return 0;
    }
}

//可采用箭头函数
arr.sort((a, b) => { return b.age - a.age })

二:数组对象:

若数组的每一项为一个对象,要根据对象的某一key进行排序:

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

这样就可以实现对数组每一项的age属性进行排序,对上比较函数法稍作修改:

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

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

但是很多时候要排序的数据都是字符串数据,这时候就要修改一下compare方法,否则就会向上面一样数字被转为ASCII码值进行排序。将数组修改一下:

let arr = [{name: "zwj", age: "24"}, {name: "wbl", age: "130"}];

此时age的值为字符串,对其用 arr.sort(compare("age")) 之后,所得到的数据为

期望数据应该是24在130前面。

对比较函数进行一些修改:

let compare = function (prop) {
    return function (obj1, obj2) {
        let val1 = obj1[prop];
        let 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;
        }            
    } 
}

在比较函数中,先把比较属性值转化为数字 Number(val1) 再通过 !isNaN(Number(val1)) 判断转化后的值是不是数字(有可能是NaN),转化后的值如果是数字,则比较转换后的值,这样就可以得到想要的结果了, 调用 arr.sort(compare("age")) 得到:

可知排序正确

参考整理自 www.cnblogs.com/xljzlw/p/36…