==sort()==方法会改变原数组,默认按unicode码顺序排列
我们通常遇到的都是数组排序,对于对象数组当然也是可以的,方法如下:
数组排序
例1:我们将创建一个数组,并按字母顺序进行排序:
<script type="text/javascript">
var arr = new Array(4)
arr[0] = "G"
arr[1] = "J"
arr[2] = "T"
arr[3] = "A"
document.write(arr.sort()) //A G J T
</script>
例2:我们将创建一个数组,并按字母顺序进行排序:
var arr = [2,3,13,17,4,19,1];
arr.sort() // 结果:[1, 13, 17, 19, 2, 3, 4]
至此,我们了解了sort()在没有函数传参的情况下:
默认按照首字母AZ、az排序,以及0~9排序。
原理:真正的默认排序顺序是根据字符串Unicode码点。字符串根据ASCII码进行排序。
若想对数组按照大小进行排序,则需要在sort()方法中添加比较函数
var arr = [2,3,13,17,4,19,1];
arr.sort(function(a,b){ // 这是比较函数
return b - a; // 降序
})
console.log(arr) // 结果:[19, 17, 13, 4, 3, 2, 1]
以上代码可知,升序排列方法为:
function sortNumber(a,b)
{
return a - b //同理,如果是降序,则为b - a
}
对象数组排序
sort方法接收一个函数作为参数。
我们可以在参数中嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同。
意思是:根据xx属性的值进行排序
var arr = [
{name:'zopp',age:0},
{name:'gpp',age:18},
{name:'yjj',age:8}
];
function compare(用于判断的属性名){
return function(a,b){
var value1 = a[用于判断的属性名];
var value2 = b[用于判断的属性名];
return value1 - value2;
}
}
console.log(arr.sort(compare('age'))) //返回对象,age从小到大正向排序
可以选择它的某一属性进行比较
var arr = [
{ name:"小明", age:12 },
{ name:"小红", age:11 },
{ name:"小刚", age:15 },
{ name:"小华", age:13 }
];
function compare(p){ //这是比较函数
return function(m,n){
var a = m[p];
var b = n[p];
return a - b; //升序
}
}
arr.sort(compare("age"));
console.log(arr);
//结果如下:
//[{name: "小红", age: 11},
//{name: "小明", age: 12},
//{name: "小华", age: 13},
//{name: "小刚", age: 15}]
字母排序兼容
我们已经学会了字面量值的升序降序,以及根据属性名对对象数组进行的升序降序
但要是字母大小写不同,该如何来确定是升序排列,还是降序排序呢?
默认情况下,对字符串排序,是按照ASCII的大小比较的。
现在,我们提出排序应该忽略大小写,按照字母序排序。
要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:
toUpperCase() 方法:把字符串转换为大写。
以下算法基于js底层的JS引擎实现,严格意义上并非某种算法。
而是对于sort()函数的高阶应用!
(s1、s2)为升序,(s2、s1)为降序
var arr = ['Google', 'apple', 'Microsoft'];
function english(s1, s2) {
x1 = s1.toUpperCase();
x2 = s2.toUpperCase();
if (x1 < x2) {
return -1;
}
if (x1 > x2) {
return 1;
}
return 0;
}
arr.sort(english); // ['apple', 'Google', 'Microsoft']
sort()原理与通用方法
参考字母排序方法
让我们来看看sort()是如何通过0,1,-1
来对不同的对象数组进行排序的。
关于前面的字母排序方法,我使用的廖雪峰大神的博客教学代码,接下来为了方便理解,我还会使用他的代码。
sort()通用方法
①通用简单升序
var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
if (x < y) {
return -1;
}
if (x > y) {
return 1;
}
return 0;
});
console.log(arr); // [1, 2, 10, 20]
② 通用简单降序
改变上一段代码的return返回值的1和-1的位置(位置对调)。