我注意到当比较函数返回0
时,IE9排序顺序正在改变元素顺序。
请参阅:
var myarray=[
{id:1,val:0},
{id:2,val:0},
{id:3,val:7},
{id:4,val:41}
];
myarray.sort(function(a,b){return a.val - b.val});
for(var i in myarray)
{
console.log(myarray[i].id);
}
Chrome,Firefox,Opera和Safari的当前稳定版本获得了以下输出:1 2 3 4
。
IE7和IE8的输出相同。
IE9输出为:2 1 3 4
为什么呢?这是正常的吗?
答案 0 :(得分:4)
如果您尝试迭代数字属性,请不要在数组上使用for...in
,原因有两个:
Array.prototype
的方法和属性; 这两点也适用于Object
。事实上,Chrome不符合最常见的浏览器行为,导致heated debate in a Chrome bug report。
答案 1 :(得分:3)
来自MDC(强调我的):
如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对所有不同的元素进行排序。 [注意:ECMAscript标准不保证这种行为] ,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。
根据我的经验,只有Chrome / Firefox才能做到这一点。 Opera 11对我的行为是......没有明确定义。
例如,使用sort将所有零移动到数组的顶部:
[1, 0, 3, 0, 5, 0, 2].sort(function (a, b) { return b === 0 && 1 || 0;});
答案 2 :(得分:2)
根据您的排序功能,这两个元素都是相同的,它们出现在哪个顺序无关紧要。浏览器可以按原样保留订单,也可以根据需要切换订单。 ..两者都不是保证。
如果两者不相等,那么您的排序功能不正确,并且还应考虑其他项目。