数组排序array.sort()

语法

array.sort(function (a,b){
   return a-b;
});

参数function可选。规定排序顺序。必须是方法。

注1:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。

注2:该操作在原数组中进行,即原数组发生改变


如果想按照其他规则进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。

若 a 等于b,则返回 0。

若 a 大于 b,则返回一个大于 0 的值。

简单点就是:比较函数两个参数a和b,返回a-b 升序,返回b-a 降序


基本示例

var nums = [ 1,5,4,3];
nums.sort();
console.log(nums);
// (4) [1, 3, 4, 5]

使用方法

nums.sort(function(a,b){
    return a-b;
});
console.log(nums);
// (4) [1, 3, 4, 5]

使用方法(反序)

nums.sort(function(a,b){
    return b-a;
});
console.log(nums);
// (4) [5, 4, 3, 1]

根据对象属性进行排序

var objs = [{ id: 3, title: 'title3'},{ id: 1, title: 'title1'},{ id: 4, title: 'title4'},{ id: 2, title: 'title2'}];
objs.sort();
console.log(objs);
// 顺序没变

objs.sort(function(a,b){
    return a.id-b.id;
});
// 按id进行顺序排序

我的一个使用场景

需要展示一个表格数据,并且按月份进行排序显示,但是这个表格数据的每一行,都是通过ajax独立获取。

我们创建一个变量items进行存放数据,每次ajax获取完后就往items.push一条数据

由于js是基于异步的,也就是执行ajax后获取到数据的时间是不固定的,最终items的数据其实是乱序的

为了使得其按月份排序,每次push之后执行一次sort

items.push(row);
items.sort(function(a,b){
  return a.year + a.month - b.year - b.month;
});