一、普通数组
// js中用方法sort()为数组排序。sort()方法有一个可选参数,是用来确定元素顺序的函数。如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序。如:
let arr1 = [12, 34, 2, 42, 456, 234];
console.log(arr1.sort()); //12,2,234,42,456
let arr2 = ['a', 'b', 'u', 'Q', 'S', 'A'];
console.log(arr2.sort());
// 比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个之后则返回一个正数。
//升序
let compareSec = function (obj1, obj2) {
if (obj1 > obj2) {
return 1
}
else if (obj1 < obj2) {
return -1
}
else {
return 0
}
}
console.log(arr1.sort(compareSec))
console.log(arr2.sort(compareSec))
//降序,
let compareAsce = function (obj1, obj2) {
if (obj1 < obj2) {
return 1
}
else if (obj1 > obj2) {
return -1
}
else {
return 0
}
}
console.log(arr1.sort(compareAsce))
console.log(arr2.sort(compareAsce))
// 我们并不能用比较函数比较一个不能转化为数字的字符串与数字的顺序:
var arr = ["b", 5];
console.log(arr.sort(compareSec))
// 结果是 ["b", 5] 。因为比较函数在比较时,会把先把字符串转化为数字,然后再比较,字符串b不能转化为数字,所以就不能比较大小。然而,当不用比较函数时,会比较ASCII值,所以结果是 [5, "b"] 。
console.log(arr.sort());
二、数组对象
let arr1 = [
{ name: 'zjl', age: 23, love: 'dwb' },
{ name: 'dwb', age: 24, love: 'zjl,zmf' },
{ name: 'zmf', age: 22, love: 'dwb' },
{ name: 'sliu', age: 29, love: 'abc' },
{ name: 'zjl', age: 22, love: 'dwb' },
];
let compare = function (obj1, obj2) {
let value1 = obj1.age;
let value2 = obj2.age;
if (value1 > value2) {
return 1;
} else if (value1 < value2) {
return -1;
} else {
return 0;
}
};
console.log(arr1)
console.log(arr1.sort(compare));
// 但是对age属性进行排序时需要注意了,如果age属性的值是数字,那么排序结果会是我们想要的。但很多时候我们从服务器传回来的数据中,属性值通常是字符串。
// 我们的期望是5排在25前面,但是结果不是。这是因为当两个数字字符串比较大小时,会比较它们的ASCII值大小,比较规则是:从第一个字符开始,顺次向后直到出现不同的字符为止,然后以
// 第一个不同的字符的ASCII值确定大小。所以"24"与"5"比较大小时,先比较”2“与"5"的ASCII值,显然”2“的ASCII值比"5"小,即确定排序顺序。
// 现在,我们需要对比较函数再做一些修改:
let arr2 = [
{ name: 'zjl', age: '23', love: 'dwb' },
{ name: 'dwb', age: '24', love: 'zjl,zmf' },
{ name: 'zmf', age: '22', love: 'dwb' },
{ name: 'sliu', age: '29', love: 'abc' },
{ name: 'zjl', age: '22', love: 'dwb' },
];
let compareAll = 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;
}
}
};
console.log(arr1.sort(compareAll("age")))
console.log(arr2.sort(compareAll("age")))
//只是最近项目中遇到了对数组对象进行排序的问题,所以在这里在网上找了一些文章写分享一下,相信总能帮到一些朋友。