js对象排序-sort()

==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的位置(位置对调)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值