yorickshan
8/31/2018 - 11:27 AM

JS -sort()方法

arrayObject.sort(sortby)

sort()对数组排序,不开辟新的内存,对原有数组元素进行调换

简单数组简单排序

var arrSimple=new Array(1,8,7,6);
arrSimple.sort();

注意:该方法不适用于两位以上,js默认比较函数把要排序的元素视为字符串,按字符串排序,不能在比较元素前先检测类型

var arr = [12,3,44,5];
console.log(arr.sort());
结果是 : [12, 3, 44, 5]

简单数组自定义排序

var arrSimple2=new Array(1,8,7,6);
arrSimple2.sort(function(a,b){
    return b-a});

a,b表示数组中的任意两个元素,若return > 0 b前a后;reutrn < 0 a前b后;a=b时存在浏览器兼容

a-b输出从小到大排序,b-a输出从大到小排序

简单对象List自定义属性排序

var objectList = new Array();
function Persion(name,age){
    this.name=name;
    this.age=age;
    }
objectList.push(new Persion('jack',20));
objectList.push(new Persion('tony',25));
objectList.push(new Persion('stone',26));
objectList.push(new Persion('mandy',23));
//按年龄从小到大排序
objectList.sort(function(a,b){
    return a.age-b.age});

简单对象List对可编辑属性的排序

var objectList2 = new Array();
function WorkMate(name,age){
    this.name=name;
    var _age=age;
    
    this.age=function(){
        if(arguments.length)
        {
          _age=arguments[0];
          return _age;
        }
        else
        {
          return _age;
        }
    }
}
objectList2.push(new WorkMate('jack',20));
objectList2.push(new WorkMate('tony',25));
objectList2.push(new WorkMate('stone',26));
objectList2.push(new WorkMate('mandy',23));
//按年龄从小到大排序
objectList2.sort(function(a,b){
    return a.age()-b.age();
    });

localeCompare()方法实现中文按照拼音排序

var array = ['武汉', '北京', '上海', '天津'];
array = array.sort(function compareFunction(item1, item2) {
  return item1.localeCompare(item2,'zh');
});
//["北京", "上海", "天津", "武汉"]
//或者引入拼音库,把汉字先转成拼音再排序

字母、数字的混合排序

var d = [1,2,3,'a','k','b','d',10,20,'c']  
d.sort(function(a,b){  
    var c = isFinite(a), // 如果 number 是有限数字(或可转换为有限数字),那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。
        d = isFinite(b);  
    return (c != d && d - c) || a > b;  
})  
console.log(d);
//[1, 2, 3, 10, 20, "a", "b", "c", "d", "k"]
//c != d && c - d  如果c和d不相等 ,也就是说比较的值不是同一类型。那就比较 c-d的值是1还是-1(中间进行了隐式类型转换)
//如果c == d 也就是说c、d是同一类型的值,c、d可能都是字母,也可能都是数字。这里就可以直接比较大小了(都是字母的话不能直接做减法)

按照字符串长度降序排序,等长的以相反的字母顺序(Z->A)排序

function lineupStudents(students){
    var stu=students.split(" ");
    stu.sort(function(a,b){
        if(a.length==b.length){
            return b.localeCompare(a);
        }else{
            return b.length-a.length;
        }
    });
    console.log(stu);
}
//stringObject 小于 target,则 localeCompare() 返回小于 0 的数
//stringObject 大于 target,则该方法返回大于 0 的数
//两个字符串相等,或根据本地排序规则没有区别,该方法返回 0
//stringObj.localeCompare(target)中谁比较谁,决定了列表的升序还是降序

object数组,属性为字符

list.sort(function (a, b) {
    return a.property < b.property ? 1 : -1; //降序
    return a.property < b.property ? -1 : 1; //升序
});