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"))
之后,所得到的数据为
对比较函数进行一些修改:
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"))
得到:
可知排序正确