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)
,那么数组会按照调用该函数的返回值排序。记 a
和 b
是两个将要被比较的元素:
如果 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是一个变量名,如果变量名为某对象的属性,则只能通过[]
运算符进行对象属性的访问。
(待续)