Javascript中的sort()语法浅谈

MDN中sort定义

MDN中是这样介绍sort()函数的:sort() 方法对数组的元素做原地的排序,并返回这个数组。 sort 可能不是稳定的。默认按照字符串的Unicode码位点(code point)排序。

arr.sort([compareFunction])

语法说明

compareFunction
可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序。
简单示例:

var tt = [23,12,34,1,560];
console.log(tt.sort()); //此时sort()内没有参数
//输出为 [1, 12, 23, 34, 560]

简单的说,sort() 在没有参数时,返回的结果是按升序来排列的。即字符串的Unicode码位点(code point)排序。
如果指明了 compareFunction(a,b) ,那么数组会按照调用该函数的返回值排序。记 ab 是两个将要被比较的元素:

  • 如果 compareFunction(a, b) (返回的值)小于 0 ,那么 a 会被排列到 b 之前,即参数a,b的顺序保存原样

  • 如果 compareFunction(a, b) (返回的值) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);

  • 如果 compareFunction(a, b) (返回的值)大于 0 , b 会被排列到 a 之前。即交换参数a,b的顺序

  • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

一个栗子

Codewars上有这样一道kata,是这样的:给定一个包含对象的数组list和一个比较关键字sortBy(数组中对象的值总为数值,比较关键字总是存在,且是对象的某一个键),返回一个降序排序后的数组。
解决方案是这样的:

function sortList (sortBy, list) {
  return list.sort(function(a,b){
    return b[sortBy]-a[sortBy]
  });
}

Note

写给与我一样的初学者:
问题是上面的函数为什么不这样写:return b.a-a.b 我们这样尝试一下:

function sortList (sortBy, list) {
  return list.sort(function(a,b){
      console.log(sortBy);//输出为b
      console.log(a.sortBy);//输出为undefined
      console.log(a[sortBy]);//输出为3,2,40
    return b[sortBy]-a[sortBy]
  });
}
sortList('b',[
  {a: 1, b: 3},
  {a: 3, b: 2},
  {a: 2, b: 40},
  {a: 4, b: 12}
]);

实际上,变量sortBy 的值为b,但在代码a.sortBy 中,sortBy的值并没有引用,sortBy被认为是a对象的一个属性,但a对象实际并没有sortBy这个属性,所以该代码会输出为undefined,因此我们要访问这类属性,应该写成a[sortBy]的代码。
在这里,sortBy是一个变量名,如果变量名为某对象的属性,则只能通过[]运算符进行对象属性的访问。


(待续)

posted @ 2016-04-29 19:16  西河  阅读(292)  评论(0编辑  收藏  举报