javascript中Array.sort方法对数组的元素做原地的排序(引用),并返回这个数组。 sort 可能不是稳定的。默认按照字符串的Unicode码位点(code point)排序。
如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。记 a 和 b 是两个将要被比较的元素:
如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。
备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
如上备注所示:当比较的两个值相等时,ECMAScript标准并不保证这一行为。因此这里的坑还得小心地踩。
e.g.
var arr = [{
name: "大号",
price: "10.00"
}, {
name: "小号",
price: "10.00"
}, {
name: "中号",
price: "10.00"
}];
arr.sort(function(a, b) {
return parseFloat(a.price) <= parseFloat(b.price) ? -1 : 1;
});
for (var i = 0; i < arr.length; i++) {
document.write(arr[i].name);
}
如上代码,在chrome等标准浏览器下会打出大号小号中号
,而在IE8会打出小号中号大号
。
一个不小心,测试同学就会给你个提个BUG,为毛IE8和Chrome不一样。
因此不要只返回-1和1,相等的情况下要给0。
debug后,看e.g.
arr.sort(function(a,b){
return (a.price - b.price); // 升序排列
return -(a.price - b.price); // 降序排列
});
------------华丽的分割线,继续补坑--------------
都TM发到线上了,遭遇bug,还好不严重。
Chome和其它浏览器在sort排序两个值相同时会有不同。据说谷歌开发者认为这不是个bug不予解决,因为V8引擎的原因,为了高效排序,称之为不稳定排序。网上有牛人说数组超过10条后会调用另一种排序方法(插入排序),10以下用的是快速排序算法,为了提交效率,所以会出现这种情况。
有人想到用索引indexOf来排序,经过测试,并没有什么卵用,重新遍历排序数组后,数组的索引是不变的。看到有高人提到添加自定义属性,自己重新给个索引,于是在排序前,给数组添加了自定义索引,再测试,OK了。
e.g.
var newSkus = [];
$.each(data, function(i, v) {
if (v.stock > 0) {
v.newIndex = i;
newSkus.push(v);
}
});
// 售价由低到高排序
newSkus.sort(function(a, b) {
return a.salePrice - b.salePrice || a.newIndex - b.newIndex;
});